繁体   English   中英

如何将包含数组的对象转换为对象的对象

[英]How to convert objects containing array into object of objects

我的代码:

function convert(arr, parent) {
    var out = [];
    for(var i in arr) {
        if(arr[i].parent == parent) {
            var children = convert(arr, arr[i].id)

            if(children.length) {
                arr[i].children = children
            }
            out.push(arr[i])
        } 
    }
    return out; //return Object.assign({}, out);tried this, but i lose parents childrens arrays
};
arras = [
    {id: 1, name: "parent1", parent: null},
    {id: 2, name: "children1", parent: 1},
    {id: 3, name: "children2", parent: 1},
    {id: 4, name: "parent2", parent: null},
    {id: 5, name: "children3", parent: 4},
    {id: 6, name: "children4", parent: 4}
]
console.log(convert(arras, null));

最终结果应该如何

{
    parent1: [
        {name: "children1"},
        {name: "children2"}
    ],
    parent2: [
        {name: "children3},
        {name: "children4"}
    ]
}

到目前为止我的输出结果如何:

[
  {id: 1, name: "parent1", parent: null}: [
        {id: 2, name: "children1", parent: 1},
        {id: 3, name: "children2", parent: 1},
    ],
  {id: 4, name: "parent2", parent: null}: [
        {id: 5, name: "children3", parent: 4},
        {id: 6, name: "children4", parent: 4}
    ]
]

首先,我要做的是将主数组转换为对象,当我倾向于这样做时,我失去了两个父对象数组......还需要更改控制台显示对象的方式,任何帮助都是值得赞赏的。

尝试这个。

 function convert(arr) { var parents = {}; for (var i in arr) { if (arr[i].parent === null) { parents[arr[i].id] = arr[i].name } } var out = {} for (i in arr) { if (arr[i].parent !== null) { var parentName = parents[arr[i].parent]; if (out.hasOwnProperty(parentName)) { out[parentName].push(arr[i].name) } else { out[parentName] = [arr[i].name] } } } return out; }; arras = [{ id: 1, name: "parent1", parent: null }, { id: 2, name: "children1", parent: 1 }, { id: 3, name: "children2", parent: 1 }, { id: 4, name: "parent2", parent: null }, { id: 5, name: "children3", parent: 4 }, { id: 6, name: "children4", parent: 4 } ] //console.log(convert(arras, null)); alert(JSON.stringify(convert(arras))); 

但注意多级别它无法正常工作。 如果您需要它,您必须保存所有可能的父列表的地图

arras.forEach(function(el){
    if(el.parent){
      el.parent=arras.find(e=>e.id==el.parent)||(console.error("no parent:"+el.parent),undefined);
    }
 });
 //resolved parent/childs....
 var newmodel = arras.reduce(function(obj,el){
   if(el.parent){
    //child
    obj[el.parent.name]=obj[el.parent.name]||[];//create new parent if neccessary
    obj[el.parent.name].push({name:el.name});
   }else{
    //parent
    obj[el.name]=obj[el.name]||[];
  }
  return obj;
  },{});

http://jsbin.com/renicijufi/edit?console

您可以构建一个树,检查父节点是否是根节点。

 var data = [{ id: 1, name: "parent1", parent: null }, { id: 2, name: "children1", parent: 1 }, { id: 3, name: "children2", parent: 1 }, { id: 4, name: "parent2", parent: null }, { id: 5, name: "children3", parent: 4 }, { id: 6, name: "children4", parent: 4 }], tree = function (data, root) { var r = {}, o = {}; data.forEach(function (a) { if (a.parent === root) { r[a.name] = []; o[a.id] = r[a.name]; } else { o[a.parent] = o[a.parent] || []; o[a.parent].push({ name: a.name }); } }); return r; }(data, null); console.log(tree); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

其他方式:

 var arrays = [ {id: 1, name: 'parent1', parent: null}, {id: 2, name: 'children1', parent: 1}, {id: 3, name: 'children2', parent: 1}, {id: 4, name: 'parent2', parent: null}, {id: 5, name: 'children3', parent: 4}, {id: 6, name: 'children4', parent: 4} ]; // First, reduce the input arrays to id based map // This step help easy to select any element by id. arrays = arrays.reduce(function (map, el) { map[el.id] = el; return map; }, {}); var result = Object.values(arrays).reduce(function (result, el) { if (!el.parent) { result[el.name] = []; } else { result[arrays[el.parent].name].push(el.name); } return result; }, {}); console.log(result); 

我认为这符合您的要求

Obj = new Object();

for( i in arras){

    person = arras[i];

    if(person.parent != null){
        if(!Obj.hasOwnProperty(person.parent)){
            // here instead of the index you can use Obj["parent"+person.parent] get the exact thing. If you are using that use tha in rest of the code 
            Obj[person.parent] = new Array();
        }

        Obj[person.parent].push(person);    
    }
    else{
        if(!Obj.hasOwnProperty(person.id)){
            // Some parents might have kids not in the list. If you want to ignore, just remove from the else. 
            Obj[person.id] = new Array()
        }
    }
}

编辑:

Obj = new Object();

for( i in arras){

    person = arras[i];

    if(person.parent != null){
        if(!Obj.hasOwnProperty(person.parent)){
            // here instead of the index you can use Obj["parent"+person.parent] get the exact thing. If you are using that use tha in rest of the code 
            Obj[person.parent] = new Array();
        }

        Obj[person.parent].push({name : person.name});  
    }
    else{
        if(!Obj.hasOwnProperty(person.id)){
            // Some parents might have kids not in the list. If you want to ignore, just remove from the else. 
            Obj[person.id] = new Array()
        }
    }
}

希望这可以帮助。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM