我有两个数组。两者都包含具有唯一的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顺序的最佳方法是什么?
答案 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)
单项排序不起作用,因为在排序数据时不尊重父子关系。
这分为两个部分:
使用给定的关系构建树。
使用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; }