Kotlin中的JavaScript匿名对象

18

如何在Kotlin中创建JavaScript匿名对象?我想创建这个对象并将其传递给Node.js应用程序。

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

26

可能的解决方案:

1)使用js函数:

val header = js("({'content-type':'text/plain' , 'content-length' : 50 ...})") 
注:括号必须使用
2) 使用 dynamic:
val d: dynamic = object{}
d["content-type"] = "text/plain"
d["content-length"] = 50

3)使用 jsdynamic

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

4) 使用本地声明:

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
}

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - John Abraham
1
2017 年的呼叫,尝试像 OP 一样做。 这个答案是否过时了? - birgersp
@gromit190 答案看起来是正确的,请让我知道您是否有任何问题。 - bashor

13

这是一个帮助函数,使用lambda语法初始化对象

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

使用方法:

jsObject {
    foo = "bar"
    baz = 1
}

生成的 JavaScript 代码

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

这是唯一一个对我有效的,救命稻草! - Robbie Cronin
返回类型可以设置为"dynamic",以便将其转换为"Json"。例如,在inline fun jsObject(init: dynamic.() -> Unit): Json {}中使用。这样会更加安全。 - iHad 169

6

还有一种可能的解决方案:

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

看起来使用转义变量名称不再起作用了。


1
这个“可能”吗?它能够工作并且做同样的事情吗? - Jayson Minard
谢谢@JaysonMinard,我已经修正了我的回答。 - Sharp

2
在我的Kotlin/JS + React项目中,我编写了一个适配器,用于接受通过构造函数传递的匿名配置对象的库。搜索一段时间后,我找到了一个使用kotlin.js.json的解决方案。
val options = json(
    "position" to "top-right",
    "durations" to json(
        "global" to 20000
    )
)

1

我是 Kotlin 的新手(虽然不是新手开发者),我稍微扩展了 @bashor 的答案,使其对于有效的 Java 标识符键更加整洁,但仍允许那些无效的键。我已经在 Kotlin 1.0.1 中进行了测试。

@JsName("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
}

Object() may be replaced with js("{}") - Vlad
这段代码是相同且更短的 fun jsObject(init: dynamic.() -> Unit) = js("{}").apply(init) - Vlad

1
这里有另一个解决方案:
定义以下帮助函数:
fun jsObject(vararg pairs: Pair<Any, Any>): dynamic {
    val result = js("({})")
    for ((key, value) in pairs) {
        result[key] = value
    }
    return result
}

然后您可以按照以下方式使用它

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

0

Kotlin/JS标准库提供了Json接口和一个json工厂函数,该函数接受Pair<String, Any?>的可变参数。

val header = json(
  "content-type" to "text/plain",
  "content-length" to 50,
)
    
header["x-another-header"] = "foo"

0

使用JavaScript的Object.assign(),可以将普通的Kotlin对象转换为JavaScript匿名对象。这样可以让您尽可能地保持在纯Kotlin和类型安全中。因此:

fun Any.toJsObject(): dynamic {
    val thisArg = this                       // Allows use in js() function
    return js("Object.assign({},thisArg)")
}

val anObject = object { val a = "a" }        // Or use a regular class
console.log( anObject.toJsObject().a )       // logs "a"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接