数组排序 - 请教一个数组的处理问题
本文介绍了数组排序 - 请教一个数组的处理问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
[
[before=>4,after=>5],
[before=>2,after=>3],
[before=>1,after=>2],
[before=>3,after=>4]
]
这样一个数组,表达的含义是4在5前面,2在3前面,1在2前面,3在4前面
根据这个数组,得到一个结果数组为[1,2,3,4,5]
请问应该怎么弄啊
解决方案
不会写 PHP,给你写个 JavaScript 的参考
const preDefined = [
{ before: 4, after: 5 },
{ before: 2, after: 3 },
{ before: 1, after: 2 },
{ before: 3, after: 4 }
];
// 将对每一个 before 或 after 创建一个双向链表节点,
// 数据结构
// {
// v: 值,
// before: 前一节点,
// after: 下一节点
// }
// 所有节点的集合就是 nodeList
nodeList = [];
// 根据值从 nodeList 中找到一个存在的节点
// 如果没有,就创建这个节点并加入到 nodeList
function findNode(v) {
let node = nodeList.find(node => node.v === v);
if (!node) {
node = { v: v };
nodeList.push(node);
}
return node;
}
// 对数据关系结点进行一个循环,连接它们的关系
preDefined.forEach(t => {
// 找到或创建 before、after 节点
let before = findNode(t.before);
let after = findNode(t.after);
// 把 before 和 after 连接起来
before.after = after;
after.before = before;
});
// 从 nodeList 中找出所有没有 before 中节点
// 这些节点就是头节点(这个样例数据中只有一个)
const heads = nodeList.filter(node => !node.before);
// 从每个头节点,按 after 引用往下找,
// 就找到了整个链条的数据,拼成数组
const all = heads.map(head => {
const list = [];
let current = head;
while (current) {
list.push(current.v);
current = current.after;
}
return list;
});
// 把所有链条打印出来(本示例中只有一条)
all.forEach(list => console.log(list));
这篇关于数组排序 - 请教一个数组的处理问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文