javascript anonymous object in kotlin

流过昼夜 提交于 2019-12-03 16:13:01

问题


how to create JavaScript anonymous object in kotlin? i want to create exactly this object to be passed to nodejs app

var header = {“content-type”:”text/plain” , “content-length” : 50 ...}

回答1:


Possible solutions:

1) with js function:

val header = js("({'content-type':'text/plain' , 'content-length' : 50 ...})") 

note: the parentheses are mandatory

2) with dynamic:

val d: dynamic = object{}
d["content-type"] = "text/plain"
d["content-length"] = 50

3) with js + dynamic:

val d = js("({})")
d["content-type"] = "text/plain"
d["content-length"] = 50

4) with native declaration:

native
class Object {
  nativeGetter
  fun get(prop: String): dynamic = noImpl

  nativeSetter
  fun set(prop: String, value: dynamic) {}
}

fun main(args : Array<String>) {
  var o = Object()
  o["content-type"] = "text/plain"
  o["content-length"] = 50
}



回答2:


Here's a helper function to initialize an object with a lambda syntax

inline fun jsObject(init: dynamic.() -> Unit): dynamic {
    val o = js("{}")
    init(o)
    return o
}

Usage:

jsObject {
    foo = "bar"
    baz = 1
}

Emited javascript code

var o = {};
o.foo = 'bar';
o.baz = 1;



回答3:


One more possible solution:

object {
        val `content-type` = "text/plain"
        val `content-length` = 50
}

It seems that it does not work anymore with escaped variable names.




回答4:


I'm a Kotlin newbie (though not a newbie developer), I slightly extended answer from @bashor to something looks neater for keys which are valid Java identifiers, but still allows ones which aren't. I tested it with Kotlin 1.0.1.

@native("Object")
open class Object {
}

fun jsobject(init: dynamic.() -> Unit): dynamic {
    return (Object()).apply(init)
}

header = jsobject {
    validJavaIdentifier = 0.2
    this["content-type"] = "text/plain"
    this["content-length"] = 50
}



回答5:


Here is another solution:
Define the following helper function

inline fun jsObject(vararg pairs: Pair<Any, Any>): dynamic {
    val result = js("({})")
    for ((key, value) in pairs) {
        result[key] = value
    }
    return result
}

You can then use it as follows

val header = jsObject("content-type" to "text/plain", "content-length" to 50)


来源:https://stackoverflow.com/questions/28150124/javascript-anonymous-object-in-kotlin

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!