2017-01-09 9 views
0

にJS-dictsを宣言するときにキーとしてJS配列を使用する方法、私はこれを書くことができます。 QML 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]] = 1dict1['0,0'] = 1に厳密に等価でです。

ボトムラインはプロパティ割り当てとプロパティアクセスで、キーを自動的に文字列にキャストします。


試し次

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

出力: { "0,0":1、 "1,4":5、 "2,4":3」 [オブジェクトオブジェクト]:42}

dict2を文字列表現にキャストし、キーとして使用しました。あなたtoString(({}))戻り"[object Object]"

これらのキャストではないため、その後toString(dict1)戻り"[object Object]"

  • dict1[({})]以来、以下の

    • dict1["[object Object]"]
    • dict1[dict2]
    • dict1[dict1]のいずれかを使用して値42にアクセスすることができますオブジェクトで同じ方法を実行したあなたができないことを意味します。property var dict2: { [1,2]:3 }。ただし、property var dict2: { "1,2":3 }はうまく動作します。

  • +0

    ありがとうございました!今、それは私にとって意味をなさない! – derM