Анонимный объект JavaScript в Котлине

как создать анонимный объект JavaScript в котлине? я хочу создать именно этот объект для передачи в приложение nodejs

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

person John Abraham    schedule 26.01.2015    source источник


Ответы (6)


Возможные решения:

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
}
person bashor    schedule 26.01.2015
comment
спасибо за быстрый ответ первое решение может работать, но оно не гибкое, я имею в виду, что это жестко закодированное значение, и я также получаю некоторые ошибки, вы можете проверить это. Второе решение создает Kotlin.createObject(.....) на стороне javascript, я не могу передать это в node.js, это не работает - person John Abraham; 26.01.2015
comment
2017 звонит, пытаясь сделать то же самое, что и ОП. этот ответ устарел? - person birgersp; 14.11.2017
comment
@ gromit190 ответ выглядит реальным, сообщите мне, если у вас возникнут проблемы с этим. - person bashor; 25.03.2018

Вот вспомогательная функция для инициализации объекта с синтаксисом лямбда

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;
person Kirill Rakhman    schedule 19.11.2017
comment
это единственное, что сработало для меня, спасатель! - person Robbie Cronin; 13.03.2019
comment
Тип возвращаемого значения может быть динамическим для Json. например inline fun jsObject(init: dynamic.() -> Unit): Json {} Это будет более чем безопасно. - person iHad 169; 21.07.2020

Еще одно возможное решение:

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

Кажется, что это больше не работает с экранированными именами переменных.

person Sharp    schedule 27.01.2015
comment
это возможно или это работает и делает то же самое? - person Jayson Minard; 31.12.2015
comment
Спасибо @JaysonMinard, я исправил свой ответ. - person Sharp; 04.01.2016

Я новичок в 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
}
person HughG    schedule 30.03.2016
comment
Object() можно заменить на js("{}") - person Vlad; 23.02.2020
comment
Это то же самое и короче fun jsObject(init: dynamic.() -> Unit) = js("{}").apply(init) - person Vlad; 23.02.2020

Вот еще одно решение:
Определите следующую вспомогательную функцию

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)
person eyelash    schedule 03.12.2019

Можно преобразовать обычный объект Kotlin в анонимный объект JavaScript, используя функцию Object.assign() 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"
person Simon Jacobs    schedule 11.05.2020