gpt4 book ai didi

javascript - 按分数排序具有层次结构的数组,可能使用 lodash。 ( Node )

转载 作者:行者123 更新时间:2023-11-30 11:23:51 25 4
gpt4 key购买 nike

我有点卡在这个上面:我有一个根据层次结构排序的对象数组 (parent_id),如下所示:

let myArray = [
{ id: 1, parent_id: null, score: 20, type: 1 },
{ id: 12, parent_id: 1, score: 25, type: 2 },
{ id: 23, parent_id: 12, score: 55, type: 3 },
{ id: 35, parent_id: 12, score: 25, type: 3 },
{ id: 10, parent_id: null, score: 75, type: 1 },
{ id: 25, parent_id: 10, score: 15, type: 2 },
{ id: 100, parent_id: 25, score: 88, type: 3 }
]

现在我想保持层次结构顺序,但也按分数对元素进行排序以获得如下内容:

let expected = [
{ id: 10, parent_id: null, score: 75, type: 1 },
{ id: 25, parent_id: 10, score: 15, type: 2 },
{ id: 100, parent_id: 25, score: 88, type: 3 },
{ id: 1, parent_id: null, score: 20, type: 1 },
{ id: 12, parent_id: 1, score: 25, type: 2 },
{ id: 23, parent_id: 12, score: 55, type: 3 },
{ id: 35, parent_id: 12, score: 25, type: 3 },
]

我正在使用嵌套的 foreach 编写非常低效的代码,它几乎可以工作,但还不够。我想知道是否有更简洁的解决方案。 (很确定有,但对我来说太聪明了)。同样在我的代码中,我依赖 type 属性,但理想情况下我不会使用它进行排序。

注意:这个数据只是一个例子,真正的数组更大,每个 parent 的 child 数量不同。

由于我的解释不是很好我们可以这样想层次结构type:1 -> 国家type:2 -> 状态type:3 -> 城市

所以我需要像这样按分数desc排序

- Country
- State
- City
- City
- State
- City
- Country and so on...

感谢任何愿意帮助我的人,

最佳答案

单一排序不起作用,因为在对数据进行排序时不考虑父子关系。

此方法分为三个部分:

  1. 分数对数据排序,因为下面的树是按插入顺序构建的。
  2. 用给定的关系构建一棵树。
  3. 遍历树并返回排序后的平面数据。

var data = [{ id: 1, parent_id: null, score: 20, type: 1 }, { id: 12, parent_id: 1, score: 25, type: 2 }, { id: 23, parent_id: 12, score: 55, type: 3 }, { id: 35, parent_id: 12, score: 25, type: 3 }, { id: 10, parent_id: null, score: 75, type: 1 }, { id: 25, parent_id: 10, score: 15, type: 2 }, { id: 100, parent_id: 25, score: 88, type: 3 }]
.sort(function (a, b) { return b.score - a.score; }),
tree = function (data, root) {
var r = [], o = {};
data.forEach(function (a) {
o[a.id] = { data: a, children: o[a.id] && o[a.id].children };
if (a.parent_id === root) {
r.push(o[a.id]);
} else {
o[a.parent_id] = o[a.parent_id] || {};
o[a.parent_id].children = o[a.parent_id].children || [];
o[a.parent_id].children.push(o[a.id]);
}
});
return r;
}(data, null), // null is the root value of parent_id
sorted = tree.reduce(function traverse(r, a) {
return r.concat(a.data, (a.children || []).reduce(traverse, []));
}, [])

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

关于javascript - 按分数排序具有层次结构的数组,可能使用 lodash。 ( Node ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48787010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com