Javascript 使用点表示法中的路径数组动态创建对象

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']; 最终的

我想知道是否有可能动态生成一个带有点符号字符串数组的对象。我想从CSV文件动态构建JSON对象。目标是将CSV构建为JSON,然后过滤属性并生成新的JSON对象

所以我想通过这样的考试

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”?