无法读取未定义的 属性 'concat'
Cannot read property 'concat' of undefined
首先,我有一个多层次的实体,如
国家单位 ----> 客户报告组 ----> 客户
每个 国家/地区单位 有不同的 客户报告组 并且后者每个有不同的 客户
在代码中变量名是
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;
};
我得到的错误是
Cannot read property 'concat' of undefined
我试过的是,因为它说它是未定义的,如果它还没有定义,我会尝试定义它
if (!(ids[cu] in ids)) {
ids[cu] = {};
ids[cu][crg] = ids[cu].concat(crg);
}
如果未定义,则定义并插入值,但如果已定义,则仅分配值
否则 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":{}}
}
}
concat 是一个用于字符串或数组的方法,这里你在一个对象上调用它,因此出现错误。
我不太清楚你要做什么,但也许你可以试试:
ids[cu][crg] = crg;
而不是:
ids[cu][crg] = ids[cu].concat (crg );
因为你似乎正在尝试这样做。
您的代码存在的问题是您使用对象来存储数据,而对象没有“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);
我会这样尝试:
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
) 以生成预期的对象键。非常直接。
首先,我有一个多层次的实体,如
国家单位 ----> 客户报告组 ----> 客户
每个 国家/地区单位 有不同的 客户报告组 并且后者每个有不同的 客户
在代码中变量名是
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;
};
我得到的错误是
Cannot read property 'concat' of undefined
我试过的是,因为它说它是未定义的,如果它还没有定义,我会尝试定义它
if (!(ids[cu] in ids)) {
ids[cu] = {};
ids[cu][crg] = ids[cu].concat(crg);
}
如果未定义,则定义并插入值,但如果已定义,则仅分配值 否则 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":{}}
}
}
concat 是一个用于字符串或数组的方法,这里你在一个对象上调用它,因此出现错误。
我不太清楚你要做什么,但也许你可以试试:
ids[cu][crg] = crg;
而不是:
ids[cu][crg] = ids[cu].concat (crg );
因为你似乎正在尝试这样做。
您的代码存在的问题是您使用对象来存储数据,而对象没有“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);
我会这样尝试:
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
) 以生成预期的对象键。非常直接。