无法读取未定义的 属性 '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) 以生成预期的对象键。非常直接。