javascript - 在 JavaScript 中使用空值对 JSON 数组进行排序
问题描述
我的 JSON 数组
var jData = [
{id: 1, parent: null},
{id: 2, parent: null},
{id: 3, parent: 1},
{id: 4, parent: 2},
{id: 5, parent: 2},
{id: 6, parent: 1}];
我希望按如下方式排序(按 id 排序,然后按父级排序)
[
{id: 1, parent: null},
{id: 3, parent: 1},
{id: 6, parent: 1}
{id: 2, parent: null},
{id: 4, parent: 2},
{id: 5, parent: 2},
];
在 JavaScript 中最好的方法是什么?
我试过了,但没有运气
jData .sort((a, b) => a.id - b.id ||a.parent- b.parent);
帮助!!
解决方案
您需要先进行拓扑排序,然后按出现顺序获取节点。
function getData(array) {
return array.flatMap(({ data, children = [] }) => [data, ...getData(children)]);
}
var data = [{ id: 1, parent: null }, { id: 2, parent: null }, { id: 3, parent: 1 }, { id: 4, parent: 2 }, { id: 5, parent: 2 }, { id: 6, parent: 1 }],
tree = function (data, root) {
var t = {};
data.forEach(data => {
Object.assign(t[data.id] = t[data.id] || {}, { data });
t[data.parent] = t[data.parent] || {};
t[data.parent].children = t[data.parent].children || [];
t[data.parent].children.push(t[data.id]);
});
return t[root].children;
}(data, null),
result = getData(tree);
console.log(result);
console.log(tree); // just to show what's happening
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- c# - 在 devexpress 组合框中使用鼠标滚动时防止选择
- string - 多串管道
- ffmpeg - 如何在 FFmpeg 中使用 scale2ref 覆盖多个图像?
- php - 如何通过 PHP 将 JSON 转换为数组
- php - 使用 php 刷新页面一次
- telegram - 如何在没有任何管理员的情况下成为 Telegram 组的管理员?
- python - 如何逐行读取文件并写入新行?
- python - 在 Python 中从日期和时间中仅提取年份
- c# - Castle.Services.Transaction 从 2.5 升级到 3.0.2 的问题
- java - Java TensorFlow 张量访问