16

如何在 kotlin 中创建 JavaScript 匿名对象?我想准确地创建这个对象以传递给 nodejs 应用程序

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

7 回答 7

22

可能的解决方案:

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) 带js+ dynamic

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
}
于 2015-01-26T13:19:45.000 回答
11

这是一个使用 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;
于 2017-11-19T17:57:44.383 回答
6

另一种可能的解决方案:

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

似乎它不再适用于转义的变量名。

于 2015-01-27T11:39:22.357 回答
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
}
于 2016-03-30T11:49:23.250 回答
0

在我的 Kotlin/JS + React 项目中,我为一个通过构造函数接受匿名配置对象的库编写了一个适配器。搜索了一段时间后,我找到了使用的解决方案kotlin.js.json

val options = json(
    "position" to "top-right",
    "durations" to json(
        "global" to 20000
    )
)
于 2022-01-30T21:36:20.553 回答
0

这是另一个解决方案:
定义以下辅助函数

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)
于 2019-12-03T00:12:19.443 回答
0

可以使用 JavaScript 的Object.assign(). 这使您可以尽可能长时间地使用纯 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"
于 2020-05-11T02:38:59.120 回答