将数组元素从一个数组位置移动到另一个数组位置

我很难弄清楚如何移动数组元素。例如,考虑到以下情况:

var arr=['a','b','c','d','e'];

如何在'b'之前编写移动'd'的函数

或者在'c'之后是'a'

移动之后,其余元素的索引应该更新。这意味着在移动后的第一个示例中

arr=['a','d','b','c','e']

这看起来应该很简单,但我不能把我的头绕在它周围

如果您想要npm上的版本,array move是最接近这个答案的,尽管它不是相同的实现。有关更多详细信息,请参阅其用法部分。此答案的早期版本(即修改的Array.prototype.move)可以在npm的Array.prototype.move上找到


我在这个功能上取得了相当好的成功:

函数数组移动(arr、旧索引、新索引){
if(新索引>=阵列长度){
var k=新的_指数-arr.length+1;
而(k--){
arr.push(未定义);
}
}
arr.splice(新的_索引,0,arr.splice(旧的_索引,1)[0]);
返回arr;//用于测试
};
//返回[2,1,3]
log(数组_move([1,2,3],0,1))

请注意,最后一个返回仅用于测试目的:splice在适当的位置对阵列执行操作,因此不需要返回。扩展而言,此移动是就地操作。如果要避免这种情况并返回副本,请使用slice

逐步完成代码:

  1. 如果new\u index大于数组的长度,我们希望(我假定)用新的undefineds正确地填充数组。这个小片段通过在数组上按undefined,直到获得正确的长度来处理这个问题
  2. 然后,在arr.splice(old_index,1)[0]中,我们拼接出旧元素拼接返回拼接出的元素,但它位于数组中。在上面的示例中,这是[1]。因此,我们获取该数组的第一个索引以获得原始1
  3. 然后我们使用splice将此元素插入新索引的位置。因为我们在ifnew\u index>arr.length,它可能会出现在正确的位置,除非他们做了一些奇怪的事情,比如传递负数

解释负指数的更为奇特的版本:

函数数组移动(arr、旧索引、新索引){
while(旧索引<0){
旧索引+=阵列长度;
}
while(新索引<0){
新的_索引+=阵列长度;
}
if(新索引>=阵列长度){
var k=新的_指数-arr.length+1;
而(k--){
arr.push(未定义);
}
}
arr.splice(新的_索引,0,arr.splice(旧的_索引,1)[0]);
返回arr;//用于测试目的
};
//返回[1,3,2]
log(数组移动([1,2,3],-1,-2))

这应该考虑到像array\u move([1,2,3],-1,-2)这样的问题(将最后一个元素移到倒数第二位)。结果应该是[1,3,2]

无论哪种方式,在您最初的问题中,您将在c之后对a执行array\u移动(arr,0,2)。对于db之前,您将执行数组移动(arr,3,1)

发表评论