Javascript 使用点表示法中的路径数组动态创建对象
我想知道是否有可能动态生成一个带有点符号字符串数组的对象。我想从CSV文件动态构建JSON对象。目标是将CSV构建为JSON,然后过滤属性并生成新的JSON对象 所以我想通过这样的考试Javascript 使用点表示法中的路径数组动态创建对象,javascript,arrays,json,object,Javascript,Arrays,Json,Object,我想知道是否有可能动态生成一个带有点符号字符串数组的对象。我想从CSV文件动态构建JSON对象。目标是将CSV构建为JSON,然后过滤属性并生成新的JSON对象 所以我想通过这样的考试 var obj = {}; var keyArray = ['meta', 'logos', 'warranty', 'specs', 'specs.engine', 'specs.engine.hp', 'specs.engine.rpm', 'specs.engine.manufacturer']; 最终的
var obj = {};
var keyArray = ['meta', 'logos', 'warranty', 'specs', 'specs.engine', 'specs.engine.hp', 'specs.engine.rpm', 'specs.engine.manufacturer'];
最终的结果会是这样的
obj = {
meta: {
},
logos: {
},
specs: {
engine: {
hp: {
}
}
}
}
这里是主要功能
function addObjectsByKey(obj, keyArray) {
for (var key in keyArray) {
// If keyword is not in object notation
if (!(keyArray[key].match(/\./))) {
// If the object property is not set, set it
if (!(obj[keyArray[key]])) {
obj[keyArray[key]] = {};
}
} else {
// Split array element (in dot notation) into an array of strings
// These strings will be object properties
var pathAsArray = keyArray[key].split('.');
var path = null;
for (var k in pathAsArray) {
if (path == null) {
obj[pathAsArray[k]] = {};
path = pathAsArray[k];
} else {
obj[path][pathAsArray[k]] = {};
path += '.' + pathAsArray[k];
}
}
// throw Error('end');
}
}
// return obj;
}
您可以使用
forEach
循环,在循环中,您可以在
上拆分每个元素,然后使用reduce
方法构建嵌套对象
var keyArray=['meta'、'logo'、'warranty'、'specs'、'specs.engine'、'specs.engine.hp'、'specs.engine.rpm'、'specs.engine.manufacturer'];
常量结果={}
keyArray.forEach(key=>{
//循环键数组
//使用分割每个键。并在该键上使用reduce
//在reduce的每次迭代中,返回r[e],如果属性存在,它将成为值
//或新对象(如果没有)
//这样,只要关键帧与对象中的现有关键帧匹配,就可以转到任何对象深度。
key.split('.').reduce((r,e)=>r[e]=(r[e]|{}),result)
})
console.log(result)
您可以使用函数reduce
以及嵌套的forEach
来构建路径
- 第一个
将累加嵌套操作reduce
- 嵌套的
将根据点分隔的当前路径构建对象及其子对象forEach
let keyArray=['meta'、'logo'、'warranty'、'specs'、'specs.engine'、'specs.engine.hp'、'specs.engine.rpm'、'specs.engine.manufacturer'],
newObj=keyArray.reduce((累计,路径)=>{
让前一个=累计;
path.split('.').forEach(键=>{
如果(上一个[键])上一个=上一个[键];
else-previous=previous[key]={};
});
返回累计;
}, {});
console.log(newObj)代码>
作为控制台包装{max height:100%!important;top:0;}
这里的问题是您不知道叶节点的类型。考虑你的第一个路径“META”。在输出中,您将显示此已创建且为空的对象。你怎么知道它应该是一个对象而不是一个数组。就这点而言,你怎么知道它不应该是一个原语。“specs.engine.hp”真的应该是一个对象呢。我想这应该是一个原始数字。我对这里的运算感到有点抱歉。这两个答案都采用了基本上难以辨认的功能性方法。在过去几年的某个时候,编程不再是交流思想,而是将其全部塞进一行。@bhspencer“应该”specs.engine.hp“真的是一个对象”为了举例,我缩短了一些内容。在我的实际数据中,它被称为其他东西,并具有设置hp和rpm的属性。请解释一下代码的工作原理。你使用lambda和函数式编程习惯很酷,但我完全不懂。给变量起有意义的名字会怎么样。什么是“ia”?