javascript - 算法重新排序对象列表
问题描述
我正在寻找一种算法来重新排序字典列表或 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 但这不起作用。
解决方案
关于更好的数据结构的讨论是当场的。但是如果你仍然想实现你所要求的,我们可以编写一个简单的 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
添加错误检查并不难。
另请注意,这会返回一个新数组,并且不会改变原始数组;我们这里不是野蛮人。
推荐阅读
- arrays - 在 5 天的天气数组中,如何使用 swift 每天隔离一个时间段?
- android - Date() 没有捕捉到时区变化
- java - The activity I'm trying to run crashes my app but with no errors? (Android Studio)
- javascript - 等待一个javascript函数返回
- mobile - Fiori Mobile - 隐藏启动板标题
- django - Django rest框架M2M序列化器保存嵌套对象
- python-3.x - 由于负索引查找,Keras 嵌入层中的 InvalidArgumentError
- python - 根据字符串值的长度将字典一分为二
- typescript - 不能满足打字稿类型函数的返回类型
- javascript - 如何使文本不超出 div