这就是我得到的数组
[
{ id: 1, name: 'hello world', reference_id: null },
{ id: 2, name: 'hello world', reference_id: null },
{ id: 3, name: 'hello world', reference_id: 1 },
{ id: 4, name: 'hello world', reference_id: null },
{ id: 5, name: 'hello world', reference_id: 1 },
{ id: 6, name: 'hello world', reference_id: 2 },
]
我需要把这个数组重新排序成类似这样的东西。
[
{ id: 1, name: 'hello world', reference_id: null },
{ id: 3, name: 'hello world', reference_id: 1 },
{ id: 5, name: 'hello world', reference_id: 1 },
{ id: 2, name: 'hello world', reference_id: null },
{ id: 6, name: 'hello world', reference_id: 2 },
{ id: 4, name: 'hello world', reference_id: null },
]
这是我试过的代码
const parentIndex = skus?.findIndex(item => item.id === item.reference_id);
console.log(parentIndex)
if (parentIndex !== -1) {
const parentId = skus[parentIndex].id;
const parentItem = skus.splice(parentIndex, 1)[0];
const referencedItem = skus.find(item => item.id === parentId);
if (referencedItem) {
const referencedIndex = skus.indexOf(referencedItem);
skus.splice(referencedIndex + 1, 0, parentItem);
} else {
skus.push(parentItem);
}
}
当我运行这段代码时,我得到了一些奇怪的意外结果,大多数时候它不会在第一行之后运行。
有人能帮我解决这个问题吗?我正在努力寻找解决方案。
3条答案
按热度按时间omjgkv6w1#
一个
.map()
可以帮助定义一个排序标准,这个标准可以被应用,然后稍后再次被删除(通过第二个.map()
调用):好的,按照评论中的要求。这里有一个解决方案(只需一个
.sort()
调用):第二个版本可以处理任何数字id的孩子(最大为“9999”)。
arknldoa2#
你可以通过一个自定义的
sort()
函数来实现:更新
如果
1-给定的数组可以按id或
2-可能会有嵌套引用,如评论中所述,这是我建议的解决方案:
ni65a41a3#
看起来你所追求的是,带有
reference_id
的元素紧跟在带有id
的元素之后。如果是这样的话,那么你实际上是在寻找一个数据的前序遍历作为一个树(参见:tree traversal)。以下方法适用于任何嵌套级别。
但是,如果你只是在寻找一个
id
的主排序,其中元素共享一个reference_id
分组在一起,那么你可以首先group-byreference_id
,然后在flattening分组数组之前按每个组的第一个元素的id
排序。这里对input
数组的副本执行id
的初始排序。