无法读取未定义的属性'concat'

时间:2016-08-17 10:05:03

标签: javascript javascript-objects multi-level

首先,我有一个多级实体,如

国家/地区单位 ----> 客户报告小组 ---->的客户

每个国家/地区单位有不同的客户报告组,后者各有客户

在代码中变量名是

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":{}}
    }
}

3 个答案:

答案 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)以生成预期的对象键。很直接。