数组排序 - 请教一个数组的处理问题

查看:74
本文介绍了数组排序 - 请教一个数组的处理问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

[
    [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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆