首先,我有一个多级实体,如
国家/地区单位 ----> 客户报告小组 ---->的客户
每个国家/地区单位有不同的客户报告组,后者各有客户
在代码中变量名是
cu ----> crg --->客户
这在名为menuData的多级对象中表示:
menuData = {
cu1: {
CRG3: {
Customer1: {},
Customer5: {}
},
CRG7: {
Customer3: {},
Customer2: {},
Customer7: {}
}
},
cu4: {
CRG1: {
Customer2: {},
Customer4: {}
},
CRG3: {
Customer4: {}
}
}
};
我想要做的是为多级对象中的每个级别构建唯一ID,以及例如客户单元的ID将是相同的
cu1和cu2等等
对于客户报告组,id将由cu + crg组成 CU1 + crg4
为客户:
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?
编辑,排除输出
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":{}}
}
}
答案 0 :(得分:1)
您的代码的问题在于您使用对象来存储您的数据,对象没有方法“concat”只有数组具有“concat”方法。您的对象必须看起来像这样:
menuData = [
"cu1": [
"CRG3": [ "Customer1":{}, "Customer5":{} ],
"CRG7": [ "Customer3":{}, "Customer2":{}, "Customer7":{} ]
],
"cu4": [
"CRG1": [ "Customer2":{}, "Customer4":{} ],
"CRG3": [ "Customer4":{}]
]
]
以下是参考:MDN Array.concat()
JS中令人困惑的是,可以像数组一样访问对象属性。
好吧,我觉得concat不适合你的问题。
尝试使用类似的东西:
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);
答案 1 :(得分:0)
concat是一个用于String或Array的方法,在这里你可以在一个对象上调用它,从而产生错误。
你要做的事情对我来说有点不清楚,但也许你可以尝试一下:
ids[cu][crg] = crg;
而不是:
ids[cu][crg] = ids[cu].concat (crg );
因为这就是你想要尝试的东西。
答案 2 :(得分:0)
我会这样试试:
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;
}
递归函数的完美用例,用于传递前一层的id的数组(idsOut
)以生成预期的对象键。很直接。