【问题标题】:Cannot read property 'concat' of undefined无法读取未定义的属性“concat”
【发布时间】:2016-08-17 10:05:02
【问题描述】:

首先,我有多个实体,如

国家单位 ----> 客户报告组 ----> 客户

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

在代码中变量名是

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);
}

如果没有定义,定义它并插入值,但是如果它定义了,只赋值 否则 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":{}}
    }
}

【问题讨论】:

  • .concatArray 的方法,而不是 MDN 上的 Object Array.prototype.concat
  • 预期输出是什么?

标签: javascript javascript-objects multi-level


【解决方案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);

【讨论】:

  • 我刚进入这家公司,数据以所描述的对象格式存储,现在要做的是从多级对象 menuData 中获取唯一 ID
【解决方案2】:

concat 是用于字符串或数组的方法,在这里您在对象上调用它,因此会出现错误。

我有点不清楚你想要做什么,但也许你可以试试:

ids[cu][crg] = crg;

而不是:

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

因为这就是你似乎正在尝试的。

【讨论】:

    【解决方案3】:

    我会这样尝试:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-20
      • 2023-04-08
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      相关资源
      最近更新 更多