Как использовать 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 }
будет работать просто отлично.