javascript-创建嵌套数据时“找不到未定义的属性名称”

前端之家收集整理的这篇文章主要介绍了javascript-创建嵌套数据时“找不到未定义的属性名称” 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在尝试使用现有数据集创建嵌套树对象.
原始数据集为:

var raw_data = [
["A1","B1","C1",1],["A1","C2",2],"B2",3],4],5],6],["A2",7],8],9],10],11],12],13],14]
];

我希望我的最终数据如下所示:

{'A1': 
  {'B1': {'C2': 2,'C1': 1},'B2': {'C2': 6,'C1': 4}
  },'A2': 
  {'B1': {'C2': 10,'C1': 8},'B2': {'C2': 14,'C1': 12}
  }
}

到目前为止,这是我的进度.

var obj = {};

for(i = 0; i< raw_data.length; i++) { 
  var [x,y,z,value] = raw_data[i];
  obj[x][y][z] = value;  
}

我遍历数据并在空数据上递归运行属性值.
例如:在第一次迭代中,我将obj [‘A1’] [‘B1’] [‘C1’] = 1设置为1.
但是,这会引起问题,因为第一个递归(obj [‘A1’])将返回undefined,因此出现以下错误

"TypeError: Cannot set property 'B1' of undefined

为了解决这个问题,我尝试使用ES6这样的代理对象,而不是var obj = {}:

var obj = new Proxy({},{ 
    get: function(target,name) {
        if (!(name in target)) {
            console.log("Non-existant property '" + name + "'");
            var val = target[name] = typeof(target);  //Returning reference to already created object
            return val;  
        }
    }
}); 

但是,现在返回以下错误
    “ TypeError:无法设置未定义的属性’C1′

我在这里做错了什么?

最佳答案
您可以使用动态方法并减少给定的键,直到最后一个元素,并将其用作分配值的访问器.

获取正确的内部对象的内部,如果对象不存在,则会将默认对象分配给属性.

function setValue(object,path,value) {
    var last = path.pop();
    path.reduce((o,k) => o[k] = o[k] || {},object)[last] = value;
    return object;
}

var raw_data = [["A1",14],15]],object = raw_data.reduce((r,a) => setValue(r,a.slice(0,-1),a[a.length - 1]),{});

console.log(object);
.as-console-wrapper { max-height: 100% !important; top: 0; }
原文链接:https://www.f2er.com/js/531095.html

猜你在找的JavaScript相关文章