Как использовать JS Arrays в качестве ключей при объявлении JS-dicts в QML

В реализации QML JS я могу написать это:

property var dict1: ({})
property var dict2: { 'a':1, 'b':2, 'c':3 }
// property var dict3: { [0,0]:1, [1,4]:5, [2,4]:3 } // can't do this!

// but can do this.
Component.onCompleted: {
    dict1[[0,0]] = 1
    dict1[[1,4]] = 5
    dict1[[2,4]] = 3
}

Так что последняя часть использует JS-Arrays в качестве ключей в dict. Однако объявление, как в строке 3 (dict3), невозможно. Я не понимаю, почему одна запись не должна быть возможной, если ожидаемый результат возможен другими средствами.

Поэтому мой вопрос: как можно было бы создать dict без необходимости Component.onCompleted или подобный взлом? Если нет способа сделать это, причина, по которой, будет принята с благодарностью.

1 ответ

Решение

Ключи объектов JS всегда являются строками. Не существует такого понятия, как массив как ключ или объект как ключ.

dict1[[0,0]] = 1 строго эквивалентно dict1['0,0'] = 1,

Суть в том, что присваивание свойств и доступ к свойствам автоматически приводят ключ к строке.


Попробуйте следующее:

dict1[dict2] = 42
console.log(JSON.stringify(dict1))

Вывод: {"0,0": 1, "1,4": 5, "2,4": 3, "[объект объект]":42}

Выражение dict2был приведен к его строковому представлению и использован в качестве ключа. Затем вы можете получить доступ к значению 42 с помощью любого из следующих

  • dict1["[object Object]"]
  • dict1[dict2]
  • dict1[dict1] поскольку toString(dict1) возвращается "[object Object]"
  • dict1[({})] поскольку toString(({})) возвращается "[object Object]"

Эти приведения не выполняются одинаково при создании объекта, что означает, что вы не можете сделать property var dict2: { [1,2]:3 }, Тем не мение, property var dict2: { "1,2":3 } будет работать просто отлично.

Другие вопросы по тегам