如何在js中将对象数组转换为嵌套对象,反之亦然

时间:2018-03-15 20:02:29

标签: javascript arrays object nest-nested-object

层次结构对象存储在层次结构中的对象数组
属性。基于此层次结构

完成对象的嵌套
{  
  "obj1":{  
    "prop1":"value",  
    "obj2" : {  
      "prop2":"value",  
      "prop3":"value"  
    },  
    "obj3":{  
      "prop4":"value",  
      "prop5":"value",  
      "obj4" : {  
        "prop6":"value",  
        "prop7":"value",  
        "arr"  :["val1", "val2"]  
      }  
    }  
  }  
}  

预期的嵌套对象,此处删除了层次结构键

var input = "nested array as above";  
var output = {};  
var globalTemp = output;  
for(var i = 0 ; i<input.length ; i++){  
  var tempObj = input[i];  
  for(var key in tempObj){  
    if(key == "hierarchy"){     
      globalTemp = globlalTemp[tempObj[key]] = {};  
    }  
  }  
}  
console.log(globalTemp);

我试过的代码但在第8行无法获得层次结构

{{1}}

2 个答案:

答案 0 :(得分:2)

您可以使用reducehierarchy方法在里面创建当前对象的浅层副本并删除const data = [{"hierarchy":["obj1"],"prop1":"value"},{"hierarchy":["obj1","obj2"],"prop2":"value","prop3":"value"},{"hierarchy":["obj1","obj3"],"prop4":"value","prop5":"value"},{"hierarchy":["obj1","obj3","obj4"],"prop6":"value","prop7":"value","arr":["val1","val2"]}] const result = {} data.forEach(function(o) { o.hierarchy.reduce(function(r, e) { const clone = Object.assign({}, o); delete clone.hierarchy return r[e] = (r[e] || clone) }, result) }) console.log(result)属性。

<custom-button [clickFn]="onButtonClickHandler"></custom-button>

答案 1 :(得分:1)

使用更新版本的javascript,您可以使用restparameters作为所需值键/值对,并通过保存最后一个属性来迭代给定的层次结构属性来构建嵌套结构,以分配其余属性。

回收的部分getFlat使用数组作为堆栈而不进行递归调用,以防止首先尝试获取最深度节点的深度优先搜索。

在开始时,堆栈是一个数组,其中包含实际对象的数组,另一个对象具有空hierarchy属性,且数组为空,因为实际上没有对象的键是已知的。

然后while循环检查堆栈是否有一些项目,如果是,它将获取堆栈的第一项并获取destructuring assignment获取对象o以获取回来所有键/值对和另一个对象temp,其中包含一个属性hierarchy,其中包含对象o的路径数组。

push标志设置为false,因为以后只能将找到的属性推送到结果集。

现在检查对象的所有属性以及是否

  • 该值是真实的(以防止null值),
  • 类型是一个对象(null是一个对象)和
  • 该属性不是数组

然后找到一个新对象进行检查。该对象被推送到堆栈,其中包含实际路径。

如果没有,则找到一个值。此键/值对将添加到temp对象,并且该标志设置为true,以便稍后推送到结果集。

继续使用对象的键。

稍后检查push并将带有temp属性和自定义属性的hierarchy对象推送到结果集。

function getFlat(object) {
    var stack = [[object, { hierarchy: [] }]],
        result = [],
        temp, o, push;

    while (stack.length) {
        [o, temp] = stack.shift();
        push = false;
        Object.keys(o).forEach(k => {
            if (o[k] && typeof o[k] === 'object' && !Array.isArray(o[k])) {
                stack.push([o[k], { hierarchy: temp.hierarchy.concat(k) }]);
            } else {
                temp[k] = o[k];
                push = true;
            }
        });
        push && result.push(temp);
    }
    return result;
}

var data = [{ hierarchy: ["obj1"], prop1: "value" }, { hierarchy: ["obj1", "obj2"], prop2: "value", prop3: "value" }, { hierarchy: ["obj1", "obj3"], prop4: "value", prop5: "value" }, { hierarchy: ["obj1", "obj3", "obj4"], prop6: "value", prop7: "value", arr: ["val1", "val2"] }],
    object = data.reduce((r, { hierarchy, ...rest }) => {
        var last = hierarchy.pop();
        hierarchy.reduce((o, k) => o[k] = o[k] || {}, r)[last] = rest;
        return r;
    }, {}),
    reclaimedData = getFlat(object);

console.log(object);
console.log(reclaimedData);
.as-console-wrapper { max-height: 100% !important; top: 0; }