在 QML 中声明 JS-dicts 时如何使用 JS 数组作为键
Posted
技术标签:
【中文标题】在 QML 中声明 JS-dicts 时如何使用 JS 数组作为键【英文标题】:How to use JS Arrays as keys when declaring JS-dicts in QML 【发布时间】:2017-01-09 15:09:42 【问题描述】:在 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 作为字典中的键。然而,第 3 行 (dict3) 中的声明是不可能的。我不明白,如果预期结果可以通过其他方式实现,为什么一个符号不应该是可能的。
所以我的问题是:如何在不需要Component.onCompleted
或类似黑客的情况下实例化dict
?
如果没有办法做到这一点,一个理由,将不胜感激。
【问题讨论】:
【参考方案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,"[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
可以正常工作。
【讨论】:
谢谢!现在这对我来说很有意义!以上是关于在 QML 中声明 JS-dicts 时如何使用 JS 数组作为键的主要内容,如果未能解决你的问题,请参考以下文章