2017-01-09 24 views
0

声明JS-类型的字典时在QML JS实现中使用JS数组作为键,我可以这样写:如何在QML

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-阵列作为字典键。但是第3行(dict3)中的声明是不可能的。我不明白为什么一个符号不应该是可能的,如果预期的结果是可能的其他手段。

所以我的问题是:如何不需要Component.onCompleted或类似的破解实例化dict? 如果没有办法做到这一点,一个原因,将不胜感激。

回答

2

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浇铸到它的字符串表示,并用作密钥。然后,您可以通过以下任何

  • dict1["[object Object]"]
  • dict1[dict2]
  • dict1[dict1]的访问值42,因为toString(dict1)回报"[object Object]"
  • dict1[({})]因为toString(({}))回报"[object Object]"

这些铸件都没有在对象上以同样的方式执行创作,这意味着你不能做property var dict2: { [1,2]:3 }。然而,property var dict2: { "1,2":3 }将工作得很好。

+0

谢谢!现在对我来说很有意义! – derM