首页 > 解决方案 > 算法重新排序对象列表

问题描述

我正在寻找一种算法来重新排序字典列表或 javascript 对象数组。例如,我有以下对象列表:

my_dict = [
    {
        "id": 123,
        "priority": 1
    },
    {
        "id": 234,
        "priority": 2
    },
    {
        "id": 345,
        "priority": 3
    },
    {
        "id": 654,
        "priority": 4
    }
]

现在我想将 id 为 654 的项目更改为第一优先级。所以其他项目自动获得优先级 2,3 和 4。这应该是结果:

my_dict = [
    {
        "id": 654,
        "priority": 1
    }
    {
        "id": 123,
        "priority": 2
    },
    {
        "id": 234,
        "priority": 3
    },
    {
        "id": 345,
        "priority": 4
    },
]

另一个例子是,当我想将项目 234 的优先级降低到优先级 3 时,优先级为 3 的项目应该变为优先级 2(来自原始/第一个字典)。此列表中不应有两次优先级,也不应有空白。

my_dict = [
    {
        "id": 123,
        "priority": 1
    },
    {
        "id": 345,
        "priority": 2
    },
    {
        "id": 234,
        "priority": 3
    },
    {
        "id": 654,
        "priority": 4
    }
]

为了澄清,这里是另一个例子。如果我将 id 为 123 的项目移至优先级 4,则之前的项目应成为优先级 1,2 和 3。

my_dict = [

    {
        "id": 234,
        "priority": 1
    },
    {
        "id": 345,
        "priority": 2
    },
    {
        "id": 654,
        "priority": 3
    }
        {
        "id": 123,
        "priority": 4
    },
]

该列表应始终从优先级 1 开始。有人可以解释我如何用 python 或 javascript 实现它吗?我尝试使用 for 循环开始和 1 但这不起作用。

标签: javascriptpythonalgorithmsorting

解决方案


关于更好的数据结构的讨论是当场的。但是如果你仍然想实现你所要求的,我们可以编写一个简单的 JS 版本来做天真的事情:

const changePriority = (xs, id, to,
  idx = xs .findIndex (({id: i}) => i == id),
  ys = [...xs .slice (0, idx), ...xs .slice (idx + 1)]
) => 
  [ ...ys . slice (0, to - 1), xs [idx], ...ys .slice(to - 1)]
    .map ((x, i) => ({...x, priority: i + 1}))

const dict = [{id: 123, priority: 1}, {id: 234, priority: 2}, {id: 345, priority: 3}, {id: 654, priority: 4}]

console .log (
  changePriority (dict, 654, 2)
)
.as-console-wrapper {max-height: 100% !important; top: 0}

请注意,这取决于您和输入中实际存在id的新优先级。to添加错误检查并不难。

另请注意,这会返回一个新数组,并且不会改变原始数组;我们这里不是野蛮人。


推荐阅读