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

皮杰

层次结构对象存储在层次结构
属性中的对象数组对象的嵌套是基于此层次结构完成的

[  
  {
    "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"]  
  }
]  

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

{  
  "obj1":{  
    "prop1":"value",  
    "obj2" : {  
      "prop2":"value",  
      "prop3":"value"  
    },  
    "obj3":{  
      "prop4":"value",  
      "prop5":"value",  
      "obj4" : {  
        "prop6":"value",  
        "prop7":"value",  
        "arr"  :["val1", "val2"]  
      }  
    }  
  }  
}  

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

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);
尼娜·舒尔茨

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

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

一开始,栈是一个数组,里面有一个实际对象的数组,另一个对象有一个空hierarchy属性和一个空数组,因为实际上不知道对象的键。

然后一个while循环检查堆栈是否有一些项目,如果有,它取堆栈的第一个项目并进行解构赋值以获取一个对象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; }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法将嵌套对象转换为对象数组,反之亦然

如何在JS中将对象转换为数组列表

我必须将对象列表转换为对象,反之亦然

Java:我可以将对象列表转换为String []列表,反之亦然吗?

将对象密钥从蛇格转换为骆驼格,反之亦然的最佳方法是什么?

如何在Lodash中将对象数组转换为对象?

如何在JavaScript中将对象数组转换为对象?

如何在AngularJs中将对象转换为对象数组?

如何在普通lisp中将double-float转换为字节数组,反之亦然?

如何在Android中将视频/音频文件转换为字节数组,反之亦然?

将Java类中的成员变量转换为对象数组,反之亦然

如何在vscode中将匿名类转换为lambda表达式,反之亦然?

如何在Swift 5中将`Date`转换为`Data`,反之亦然?

如何在Android中将String []转换为String,反之亦然

如何在 CLASSIC ASP 中将字符串变量转换为 int,反之亦然

如何在现有文件中将制表符转换为空格,反之亦然

如何在Python中将字符转换为整数,反之亦然?

如何在C ++中将WCHAR *转换为字符串,反之亦然?

如何在Vim中将拆分的窗口转换为选项卡,反之亦然

如何在Android中将Drawable转换为int,反之亦然

如何在内存中将数值转换为归一化的双精度,反之亦然?

如何在C中将字符串转换为十六进制,反之亦然?

如何在Nim中将字符转换为ASCII代码,反之亦然

如何在Motorola 68000 Assembly中将奇数转换为偶数,反之亦然?

React Native-如何在Android中将图像转换为Base64,反之亦然

如何在C ++中将Big / Little-Endian字节转换为Integer,反之亦然

如何在c#中将字符串转换为LiteDb.ObjectId,反之亦然

如何在 PHP 中将 Hex 转换为 Dec int32,反之亦然?

如何在JavaScript中将对象{}转换为键值对的数组[]