【问题标题】:sort an array of objects based on previous and next id根据前一个和下一个 id 对对象数组进行排序
【发布时间】:2021-08-18 15:37:52
【问题描述】:

我有一个包含上一个和下一个任务 ID 的任务对象数组。我需要显示一组任务,这些任务根据上一个和下一个任务 ID 进行排序。例如:

我的输入任务数组是

 [
    {
    "taskId": "101",
    "previousTaskId":"0",
    "nextTaskId":"102"
    },

    {
    "taskId": "103",
    "previousTaskId":"102",
    "nextTaskId":"0"
    },

    {
    "taskId": "102",
    "previousTaskId":"101",
    "nextTaskId":"103"
    }
]

我的输出任务数组是:

[
    {
    "taskId": "101",
    "previousTaskId":"0",
    "nextTaskId":"102"
    },

    {
    "taskId": "102",
    "previousTaskId":"101",
    "nextTaskId":"103"
    },

    {
    "taskId": "103",
    "previousTaskId":"102",
    "nextTaskId":"0"
    }
]

有没有办法使用 es6 方法来实现它?我正在尝试使用 reduce 和 map 功能

const sortedTasks = tasks.reduce((acc, task) => {
    let {taskId, previousTaskId, nextTaskId} = task;
    return {...acc, task.map(function(item){
        if(item.previousTaskId === 0) //first position
            //how to compare with another taskId and assign it to acc ?

         })
    };
}, {});

【问题讨论】:

  • 什么保零作为 id?你在开始和结束时总是零吗?
  • 为什么不用内置排序功能?
  • 输入数组来自 ajax 调用,是的,第一个 object.previousTaskId 始终为 0,endObject.nextTaskId 为 0

标签: javascript sorting ecmascript-6 linked-list


【解决方案1】:

您可以从每个前驱节点构建一个引用,并从零开始构建结果。

function sort(array) {
    const
        temp = data.reduce((t, o) => {
            t[o.previousTaskId] = o;
            return t;
        }, {}),
        result = [];
    
    let p = '0';
    while (temp[p]) {
        result.push(temp[p]);
        p = temp[p]?.taskId;
    }
    return result;
}

const
    data = [{ taskId: "101", previousTaskId: "0", nextTaskId: "102" }, { taskId: "103", previousTaskId: "102", nextTaskId: "0" }, { taskId: "102", previousTaskId: "101", nextTaskId: "103" }];

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

【讨论】:

  • 非常感谢。只是为了理解代码,我通常将三元运算符与 ?其次:我有点困惑,这行是什么意思 p = temp[p]?.taskId;
  • 我明白了。如果引用为 null 或未定义,则表达式短路并返回未定义的值,而不是导致错误。谢谢
猜你喜欢
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 2015-06-17
相关资源
最近更新 更多