我很难弄清楚如何移动数组的元素。例如,给定以下内容:
var array = [ 'a', 'b', 'c', 'd', 'e'];
如何编写函数将元素 'd'
移动到 'b'
的左侧?
还是 'a'
'c'
?
移动元素后,应更新其余元素的索引。结果数组将是:
array = ['a', 'd', 'b', 'c', 'e']
这似乎应该很简单,但我无法理解它。
原文由 Mark Brown 发布,翻译遵循 CC BY-SA 4.0 许可协议
我很难弄清楚如何移动数组的元素。例如,给定以下内容:
var array = [ 'a', 'b', 'c', 'd', 'e'];
如何编写函数将元素 'd'
移动到 'b'
的左侧?
还是 'a'
'c'
?
移动元素后,应更新其余元素的索引。结果数组将是:
array = ['a', 'd', 'b', 'c', 'e']
这似乎应该很简单,但我无法理解它。
原文由 Mark Brown 发布,翻译遵循 CC BY-SA 4.0 许可协议
我喜欢这样。它简洁而且有效。
function arraymove(arr, fromIndex, toIndex) {
var element = arr[fromIndex];
arr.splice(fromIndex, 1);
arr.splice(toIndex, 0, element);
}
注意:永远记得检查你的数组边界。
原文由 SteakOverflow 发布,翻译遵循 CC BY-SA 4.0 许可协议
10 回答11.2k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
如果您想要 npm 上的版本, array-move 是最接近这个答案的,尽管它不是相同的实现。有关更多详细信息,请参阅其用法部分。可以在 npm 的 array.prototype.move 上找到此答案的先前版本(修改后的 Array.prototype.move)。
我在这个功能上取得了相当大的成功:
请注意,最后一个
return
仅用于测试目的:splice
就地对数组执行操作,因此不需要返回。通过扩展,这一move
是就地操作。如果您想避免这种情况并返回副本,请使用slice
。单步执行代码:
如果
new_index
大于数组的长度,我们希望(我假设)用新的undefined
正确填充数组。这个小片段通过在数组上推送undefined
来处理这个问题,直到我们有适当的长度。然后,在
arr.splice(old_index, 1)[0]
中,我们拼接出旧元素。splice
返回被拼接出来的元素,但它在一个数组中。在我们上面的例子中,这是[1]
。因此,我们采用该数组的第一个索引来获取原始1
。然后我们使用
splice
将这个元素插入到 new_index 的位置。由于如果new_index > arr.length
我们填充了上面的数组,它可能会出现在正确的位置,除非他们做了一些奇怪的事情,比如传入一个负数。一个更好的版本来解释负指数:
这应该正确地考虑诸如
array_move([1, 2, 3], -1, -2)
之类的事情(将最后一个元素移动到倒数第二个位置)。结果应该是[1, 3, 2]
。无论哪种方式,在您最初的问题中,您都会在
c
之后为a
执行array_move(arr, 0, 2)
。对于d
之前的b
,您将执行array_move(arr, 3, 1)
。