【发布时间】:2019-05-16 20:11:02
【问题描述】:
我想找到一个项目的方向,给定它的排序值。但是,我发现单独index 无法完成我想要的。
给定一个排序函数,我只想根据它的值确定一个项目是否实际上移动到了不同的索引,而不是因为另一个项目被移动了。
例子:
const things = [
{ id: 't1', val: 4 }, // This moves to index 1, see T1 notes
{ id: 't2', val: 2 },
{ id: 't3', val: 5 }, // This moves to index 0
{ id: 't4', val: 1 },
{ id: 't5', val: 3 },
]
// Sort to highest vals first
let thingOrder = things.sort((a, b) => b.val - a.val)
thingOrder = thingOrder.map((thing, index) => {
const oldIndex = things.indexOf(thing)
if (index === oldIndex)
thing.direction = 'same'
else if (index > oldIndex)
thing.direction = 'up'
else if (index < oldIndex)
thing.direction = 'down'
return thing
})
console.log(thingOrder)
预期结果:
{ id: 't3', val: 5 }, // Up
{ id: 't1', val: 4 }, // Same
{ id: 't5', val: 3 }, // Same
{ id: 't2', val: 2 }, // Down
{ id: 't4', val: 1 }, // Down
T1 注释:从技术上讲,ID 为 t1 的项目已移至索引 1,但不是因为它是 val,而是因为 T3 已移到它上面。
我如何才能实现发现某个项目在列表中是否真正上移或下移的目标?
【问题讨论】:
-
“从技术上讲,id 为
t1的项目已移至索引 1,但不是因为它的 val - 而是因为t3已移到它上面”。这不是真的,他们两个都是因为他们的价值观而搬家的,否则,它会一直呆在那里。 -
我知道这在技术上是不正确的。所有项目都通过 .sort 重新索引。我希望你明白我的意思,尽量不要太挑剔。 ;)
-
请问您为什么需要这个?
-
@ibrahimmahrir 是正确的。您需要自己编写一个并跟踪事情的进展情况。他将维基百科文章链接到几种不同的排序算法,这些都有伪代码,您可以按照这些伪代码创建自己的。例如:en.wikipedia.org/wiki/Insertion_sort
-
[{a: 5}, {b: 3}, {c: 3}],有人支持c,我们记录到c的值发生了变化,而a和b保持不变(只是旧数组可以),我们排序,我们得到[{a: 5}, {c: 4}, {b: 3}],我们可以清楚地说c自己移动了,但b没有
标签: javascript arrays sorting mergesort