2017-04-15 173 views
2

我的代码:如何包含数组对象转换为对象的对象

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} 
    ] 
] 

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

回答

2

如果parent是根节点,您可以检查树。

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; }

2

试试这个。

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)));

但对于多注意到它不能正常工作。如果你需要它,你必须保存的地图对所有可能的父目录

+0

功能那种无法处理这个没有一个父ID子ID,分配所有无与伦比的孩子的名字到一个数组'arras.undefined'这是不是一个好名字属性。此外,这些孩子的父母身份证在这个过程中会丢失,这将是一个重大失败。 – Blindman67

+0

@ Blindman67如果输入数据将包含没有hape属性“parent”的记录,则您注意是正确的。但对我来说,它只是错误的输入数据 –

2
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

+1

你有错字'aras.reduce' –

+0

@PavloZhukov谢谢;) –

+0

如果一个id是零,你的函数将失败 – Blindman67

1

另一种方式:

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);

+0

如果一个孩子的id为0,你的函数将失败。搞砸了整个结果 – Blindman67

1

我觉得这符合您的要求

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() 
     } 
    } 
} 

希望这会有所帮助。 :)

+0

你是唯一一个正确处理我扔掉它的所有测试用例,不会丢失数据,也不会错误地将孩子分组(如果没有匹配的父母,也可能抛出),除了一个小点之外。结果不符合要求的结构。 'data.parentName:[{name:childName},...' – Blindman67

+0

检查编辑。谢谢你的夸奖。快乐帮助你。 :) –

相关问题