2017-04-05 94 views
1

我得到一个对象数组。为了解释的缘故,我减少了属性,只留下相关的属性。 我需要排序这些对象,并创建一个新的数组。 原始阵列当然是未排序的。Javascript - 改进对象集合的排序

进入数组的对象可以有任意数量的子项。也有孩子可以有自己的孩子。但最后他们都是主对象的子对象(parent_id:null)。 //未分类

let data = [ 
{ 
id: 1, 
name:'ParentAlpha', 
parent_id: null 
}, 
{ 
id: 2, 
name:'ParentBeta', 
parent_id: null 
}, 
{ 
id: 100, 
name:'ChildOneAlpha', 
parent_id: 1 
}, 
{ 
id: 101, 
name:'ChildTwoAlpha', 
parent_id: 1 
}, 
{ 
id: 102, 
name:'SubChildOneAlpha', 
parent_id: 100 
}, 
{ 
id: 103, 
name:'SubChildTwoAlpha', 
parent_id: 100 
}, 
{ 
id: 200, 
name:'ChildOneBeta', 
parent_id: 2 
}, 
{ 
id: 201, 
name:'ChildTwoBeta', 
parent_id: 2 
}] 

我想实现的是这个(相同的结构,但我已经中省略JSON结构)。

[{ParentAlpha...}, 
{ChildOneAlpha...}, 
{SubChildOneAlpha...}, 
{SubChildTwoAlpha...}, 
{ChildTwoAlpha...}, 
{ParentBeta...}, 
{ChildOneBeta...}, 
{ChildTwoBeta...}] 

我已经做了工作code,但我认为它可以制成一个好一点的,我想了解更多信息。然而,我看着代码,我不知道如何改进它。如果有人可以指点一些指南,我将不胜感激。

我的工作代码:

let processedProducts = [], 
    processedid = [], 
    rearangedProducts = []; 

     let subParentProducts = data.slice(); 
     let masterParentProducts = data.filter((product)=>{ 
      return product.parent_id === null 
     }); 
     masterParentProducts.forEach((productParent)=>{ 
      if(processedid.indexOf(productParent.id) === -1){ 
       processedid.push(productParent.id); 
       processedProducts.push(productParent); 
      } 
        data.forEach((product, index)=>{ 
         if (product.parent_id === productParent.id){ 
          processedProducts.push(product); 
          subParentProducts[index] = null; 
         } 
         if (product.id === productParent.id) { 
          subParentProducts[index] = null 
         } 
        }) 
     }); 

     subParentProducts = subParentProducts.filter(function(n){ return n !== null }); 
     processedProducts.forEach((prod)=>{ 
      rearangedProducts.push(prod); 
      let res = subParentProducts.filter((o)=> { 
       return o.parent_id === prod.id; 
      }); 
      if (res.length > 0){ 
       rearangedProducts.push(res[0]); 
      } 
     }); 
console.log(rearangedProducts) 
+0

请提供您的努力_in问题itself_为[MCVE。链接腐烂。 – evolutionxbox

+0

完成。谢谢你的提示。 –

回答

2

您可以使用递归来构建新的有序阵列创建功能。

let data = [{"id":1,"name":"ParentAlpha","parent_id":null},{"id":2,"name":"ParentBeta","parent_id":null},{"id":100,"name":"ChildOneAlpha","parent_id":1},{"id":101,"name":"ChildTwoAlpha","parent_id":1},{"id":102,"name":"SubChildOneAlpha","parent_id":100},{"id":103,"name":"SubChildTwoAlpha","parent_id":100},{"id":200,"name":"ChildOneBeta","parent_id":2},{"id":201,"name":"ChildTwoBeta","parent_id":2}] 
 

 
function sortArray(data, parent) { 
 
    return data.reduce(function(r, e) { 
 
    if (e.parent_id == parent) { 
 
     r.push(e) 
 
     var children = sortArray(data, e.id) 
 
     if (children.length) r = r.concat(children) 
 
    } 
 
    return r; 
 
    }, []) 
 
} 
 

 
console.log(sortArray(data, null))