Javascript - 改进对象集合的排序

标签 javascript sorting

我得到了一组对象。为了便于解释,我减少了属性,只留下相关的属性。 我需要对这些对象进行排序,并创建一个新数组。 原始数组当然是未排序的。

数组中的对象可以有任意数量的子对象。 child 也可以有自己的 child 。但最后他们都是主对象的 child (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)

最佳答案

您可以使用递归创建函数来构建新的排序数组。

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

关于Javascript - 改进对象集合的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43226947/

相关文章:

java - 移动 2D ArrayList 中的元素

python - 基于多列对 numpy 文本数组中包含数字的列进行排序

javascript - 具有多个选项和不同权重的排列

javascript 在点击时获取外部表行

php - 如何使用外部 JSON...?

java - 当我运行代码时,我得到 (0, null) 并且无法弄清楚为什么

mysql - 根据 slice Go中的键顺序对数据进行排序

javascript - 文档 cookie/出现错误 "Illegal document.domain value"

javascript - 我正在尝试创建一个当您将鼠标悬停在可点击链接上时出现的弹出窗口。代码有效,但我在验证器上收到 26 个错误

python - 如何按英文日期格式排序而不是美式 pandas .sort()