2016-08-17 4 views
-1

의 특성 'CONCAT'을 읽을 수 없습니다, 나는로 시작하는 정의되지 않은

국가 단위 ---->고객보고 그룹 ---->고객

같이 개체의 멀티 레벨을 고객보고 그룹과 이후의 각각 다른 고객을 보유 서로 다른이

국가 단위

코드에서

변수 이름이이 menuData라는 다단계 객체로 표현된다

CU ----> CRG ---> 고객 인 : 내가 원하는 것을

menuData = { 
    cu1: { 
     CRG3: { 
      Customer1: {}, 
      Customer5: {} 
     }, 
     CRG7: { 
      Customer3: {}, 
      Customer2: {}, 
      Customer7: {} 
     } 
    }, 
    cu4: { 
     CRG1: { 
      Customer2: {}, 
      Customer4: {} 
     }, 
     CRG3: { 
      Customer4: {} 
     } 
    } 
}; 

할일은 다단계 객체에서 각 레벨의 고유 ID를 구성하는 것입니다. 예를 들어 고객 단위의 ID도 동일하게됩니다.

cu1 및 CU2 그래서 ID가 세제곱 + CU1 고객에 대한 + crg4

에서와 CRG 구성됩니다 고객보고 그룹에 대한

에 :

CU1 + crg4 + customer6; 내가 무슨 짓을했는지

이 getIds

라는 함수입니다
var getIds = function(menuData) { 
    var ids = {}; 
    for (cu in menuData) { 
     ids[cu] = cu; 
     for (crg in menuData[cu]) { 
      if (!(ids[cu] in ids)) { 
       ids[cu] = {}; 
       ids[cu][crg] = ids[cu].concat(crg); 
      } else ids[cu][crg] = ids[cu].concat(crg); 
      for (customer in menuData[cu][crg]) { 
       if (!ids[cu][crg]) { 
        ids[cu][crg] = {}; 
        ids[cu][crg][customer] = ids[cu][crg].concat(customer); 
       } else ids[cu][crg][customer] = ids[cu][crg].concat(customer); 
      } 
     } 
    } 
    console.log(ids); 
    return ids; 
}; 

내가 가진 오류는

나는 것입니다 노력 무슨 정의되지 않은

의 특성 'CONCAT'을 읽을 수 없습니다 , 그것이 정의되지 않았다고 말하기 때문에, 그것으로 정의하지 않으면 정의하려고합니다.

if (!(ids[cu] in ids)) { 
    ids[cu] = {}; 
    ids[cu][crg] = ids[cu].concat(crg); 
} 

정의되지 않은 경우 값을 정의하고 삽입하십시오. 그러나 정의 된 경우 else ids [cu] [crg] = ids [cu] .concat (crg);

왜이 오류가 발생합니까? 다중 레벨 객체에서 ID를 가져 오는 방법은 무엇입니까?


편집, excpected 출력

ids = { 
    "cu1": { 
     "cu1+CRG3": { "cu1+CRG3+Customer1":{}, "cu1+CRG3+Customer5":{} }, 
     "cu1+CRG7": { "cu1+CRG7+Customer3":{}, "cu1+CRG7+Customer2":{}, "cu1+CRG7+Customer7":{} } 
    }, 
    "cu4": { 
     "cu4+CRG1": { "cu4+CRG1+Customer2":{}, "cu4+CRG1+Customer4":{} }, 
     "cu4+CRG3": { "cu4+CRG3+Customer4":{}} 
    } 
} 
+3

'.concat'은'Object'가 아니라'Array'의 메소드입니다 [Array.prototype.concat] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array)/concat). –

+0

예상되는 출력은 무엇입니까? – brk

답변

1

코드 문제는 데이터를 저장하기 위해 개체를 사용하고 개체에 메서드 "연결"만있는 것이 아니라 배열에만 "연결"방법이 있다는 것입니다. 개체 작업에 다음과 같이해야합니다

menuData = [ 
    "cu1": [ 
     "CRG3": [ "Customer1":{}, "Customer5":{} ], 
     "CRG7": [ "Customer3":{}, "Customer2":{}, "Customer7":{} ] 
    ], 
    "cu4": [ 
     "CRG1": [ "Customer2":{}, "Customer4":{} ], 
     "CRG3": [ "Customer4":{}] 
    ] 
] 

Here's 참조 : MDN Array.concat()

무엇 JS에서 혼란 스러울 수 있습니다 것은 개체 속성은 배열처럼 액세스 할 수 있다는 것입니다. 예상 출력이 추가 된 후

업데이트 : CONCAT이 문제에 대한 올바른 해결책이 아니라 생각하는 것보다

괜찮습니다.

은 다음과 같이 뭔가를 시도 : 배열을 전달하는 재귀 함수에 대한

function getIds(dataIn, idsIn) { 
    idsIn = idsIn || []; 
    var dataOut = {}, idOut; 
    for (var idIn in dataIn) { 
    idsOut = idsIn.concat([idIn]); 
    dataOut[idsOut.join('+')] = getIds(dataIn[idIn], idsOut); 
    } 
    return dataOut; 
} 

완벽한 유스 케이스 :

var ids = {}; 
 

 
var menuData = { 
 
    cu1: { 
 
     CRG3: { 
 
      Customer1: {}, 
 
      Customer5: {} 
 
     }, 
 
     CRG7: { 
 
      Customer3: {}, 
 
      Customer2: {}, 
 
      Customer7: {} 
 
     } 
 
    }, 
 
    cu4: { 
 
     CRG1: { 
 
      Customer2: {}, 
 
      Customer4: {} 
 
     }, 
 
     CRG3: { 
 
      Customer4: {} 
 
     } 
 
    } 
 
}; 
 

 
for (propKeyLevel1 in menuData){ 
 
    ids[propKeyLevel1] = {}; 
 
    var propLevel1 = ids[propKeyLevel1]; 
 
    for(propKeyLevel2 in menuData[propKeyLevel1]){ 
 
    propLevel1[propKeyLevel1+"+"+propKeyLevel2] = {}; 
 
    var propLevel2 = propLevel1[propKeyLevel1+"+"+propKeyLevel2]; 
 
    
 
    for(propKeyLevel3 in menuData[propKeyLevel1][propKeyLevel2]){ 
 
     propLevel2[propKeyLevel1+"+"+propKeyLevel2+"+"+propKeyLevel3] = {}; 
 
    } 
 
    } 
 
    
 
} 
 

 
console.log(ids);

+0

방금이 회사에 새롭게 추가 된 데이터가 설명 된대로 개체 형식으로 저장되었지만 이제는 다단계 개체 menuData에서 고유 ID를 얻으려고합니다. –

0

CONCAT는 문자열이나 배열에 대한, 여기 당신이 따라서 개체 오류에 전화하는 방법입니다.

은 당신이 할하려는 것은 나에게 조금 불분명하지만, 어쩌면 당신은 그것을 시도 할 수 : 대신

ids[cu][crg] = crg; 

:

ids[cu][crg] = ids[cu].concat (crg); 

을 그건 때문에 당신이 시도 될 것으로 보인다 무엇 .

0

내가 이런 식으로 시도 할 것 (idsOut)를 사용하여 의도 된 객체 키를 생성한다. 꽤 직설적 인.