2017-01-09 3 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 
} 

그래서 마지막 부분은 DICT의 키로서 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', 4": 3 " [object Object] ": 42}

표현식 dict2은 문자열 표현으로 변환되어 키로 사용되었습니다. 그런 다음 "[object Object]"

이 캐스트가 아닌 toString(({})) 반환 이후 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