在QML中声明JS-dicts时如何使用JS Arrays作为键

时间:2017-01-09 15:09:43

标签: javascript qt dictionary qml qtquick2

在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 个答案:

答案 0 :(得分:2)

JS对象键始终是字符串。没有像array-as-key或object-as-key那样的东西。

  

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,“[object Object]”: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 }可以正常使用。