重新排列ID和Parentid的对象数组

时间:2019-02-17 19:57:24

标签: javascript arrays sorting

我有两个数组。两者都包含具有唯一的id和parentid值的对象(给定的id实际上只是由uuid生成器生成的)。 第一个排序的方式是,将具有与“ parent”不同的parentid的对象放置在具有相应id的父对象之后:

bar

第二个按嵌套的“深度”排序:

const array1 = [
  { id: "id1", parentId: "parent" },
  { id: "id2", parentId: "id1" },
  { id: "id3", parentId: "id2" },
  { id: "id4", parentId: "id3" },
  { id: "id5", parentId: "id4" },
  { id: "id6", parentId: "parent" },
  { id: "id7", parentId: "id6" },
  { id: "id8", parentId: "id7" },
  { id: "id9", parentId: "parent" }
];

将array2重新排列为array1顺序的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

创建一个辅助函数,以执行sort所需的各种比较。

const sortHelper = (a,b)=>a>b?1:a<b?-1:0;

然后写

array2.sort((a,b) => sortHelper(a.id,b.id);

那就是要求sort函数使用您提供的函数将项目排序。此处提供的函数比较每个对象的id属性的值。

答案 1 :(得分:0)

您可以使用Array.prototype.reduce()函数

const array2 = [
    { id: "id1", parentId: "parent" },
    { id: "id6", parentId: "parent" },
    { id: "id9", parentId: "parent" },
    { id: "id2", parentId: "id1" },
    { id: "id7", parentId: "id6" },
    { id: "id3", parentId: "id2" },
    { id: "id8", parentId: "id7" },
    { id: "id4", parentId: "id3" },
    { id: "id5", parentId: "id4" },
  ];
  
  const sortedArray2= array2.reduce((accumulator, currentValue) => {
    let item = accumulator.find(x => x.id === currentValue.parentId);
    let index = accumulator.indexOf(item);
    index = index !== -1 ? index + 1 : accumulator.length;
    accumulator.splice(index, 0, currentValue);
    return accumulator;
  }, []);
  
  console.log(sortedArray2);

答案 2 :(得分:0)

单项排序不起作用,因为在排序数据时不尊重父子关系。

这分为两个部分:

  1. 使用给定的关系构建树。

  2. 使用breadth-first search遍历树,逐级使用堆栈,并获得排序后的平面数据。

var data = [{ id: "id1", parentId: "parent" }, { id: "id2", parentId: "id1" }, { id: "id3", parentId: "id2" }, { id: "id4", parentId: "id3" }, { id: "id5", parentId: "id4" }, { id: "id6", parentId: "parent" }, { id: "id7", parentId: "id6" }, { id: "id8", parentId: "id7" }, { id: "id9", parentId: "parent" }],
    tree = function (data, root) {
        var o = {};
        data.forEach(function (a) {
            o[a.id] = { data: a, children: o[a.id] && o[a.id].children };
            o[a.parentId] = o[a.parentId] || {};
            o[a.parentId].children = o[a.parentId].children || [];
            o[a.parentId].children.push(o[a.id]);
        });
        return o[root].children;
    }(data, 'parent'),
    stack = [tree],
    result = [];

while (stack.length) {
    stack.shift().forEach(({ data, children = [] }) => {
        result.push(data);
        stack.push(children);
    });
}

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }