Javascript 更改任意给定索引处的数组顺序

Javascript 更改任意给定索引处的数组顺序,javascript,Javascript,给定以下数组 const arr = [13, 6075, 51] 我想以这种方式修改上述数组: 能够在某个索引之前获取“n”个元素 删除这些元素 将它们添加到同一数组的末尾 我已经能够用“切片”来完成这项工作,但是我要在数组的副本上,而不是在数组上修改它自己。简单答案 最简单的解决方案是使用shift和push操作符 shift将从数组的开头删除元素 push将在数组末尾添加一个元素 如果您按顺序执行这两个操作,那么它将从开始处提取一个元素,并将其放在末尾,如下所示: var arr

给定以下数组

const arr = [13, 6075, 51]
我想以这种方式修改上述数组:

  • 能够在某个索引之前获取“n”个元素
  • 删除这些元素
  • 将它们添加到同一数组的末尾
我已经能够用“切片”来完成这项工作,但是我要在数组的副本上,而不是在数组上修改它自己。

简单答案 最简单的解决方案是使用
shift
push
操作符

  • shift
    将从数组的开头删除元素
  • push
    将在数组末尾添加一个元素
如果您按顺序执行这两个操作,那么它将从开始处提取一个元素,并将其放在末尾,如下所示:

var arr = [1, 2, 3, 4];
var element = arr.shift();
arr.push(element);
console.log(arr); // [2, 3, 4, 1]
使用
for
循环可以执行此“N”次:

更有效的就地应答 您可以使用
Array.prototype.push.apply()一次推送多个元素,如下所示:

var removedElements = arr.splice(0, n);
Array.prototype.push.apply(arr, removedElements);
这是一个“更好”的答案,但需要理解原型——所以我把它留到最后

ES6答案 使用现代JavaScript表示法,您实际上可以执行
Array.prototype.push.apply,而不会有任何丑陋之处:

var removedElements = arr.splice(0, n);
ar.push(...removedElements);
可将上述内容转换为一个衬里:

arr.push(...arr.splice(0, n));
函数式编程答案 您正在执行的操作称为阵列上的“旋转”。有时也称为“自行车”。您可能会找到一个函数式编程库,该库将为您提供一个旋转方法,允许编写以下代码:

arr.rotate(n);
我快速浏览了一下,Lodash中请求了这样一个函数,但它被拒绝,并且从未实现过:

简单答案 最简单的解决方案是使用
shift
push
操作符

  • shift
    将从数组的开头删除元素
  • push
    将在数组末尾添加一个元素
如果您按顺序执行这两个操作,那么它将从开始处提取一个元素,并将其放在末尾,如下所示:

var arr = [1, 2, 3, 4];
var element = arr.shift();
arr.push(element);
console.log(arr); // [2, 3, 4, 1]
使用
for
循环可以执行此“N”次:

更有效的就地应答 您可以使用
Array.prototype.push.apply()一次推送多个元素,如下所示:

var removedElements = arr.splice(0, n);
Array.prototype.push.apply(arr, removedElements);
这是一个“更好”的答案,但需要理解原型——所以我把它留到最后

ES6答案 使用现代JavaScript表示法,您实际上可以执行
Array.prototype.push.apply,而不会有任何丑陋之处:

var removedElements = arr.splice(0, n);
ar.push(...removedElements);
可将上述内容转换为一个衬里:

arr.push(...arr.splice(0, n));
函数式编程答案 您正在执行的操作称为阵列上的“旋转”。有时也称为“自行车”。您可能会找到一个函数式编程库,该库将为您提供一个旋转方法,允许编写以下代码:

arr.rotate(n);

我快速查看了一下,Lodash中请求了一个类似的函数,但它被拒绝了,并且从未实现过:

一种方法是通过
拼接
进行删除,这将为您提供删除内容的数组,然后使用
推送
将这些内容添加回末尾:

function swap(arr, index) {
    const removed = arr.splice(0, index);
    arr.push(...removed);
    return arr; // Just for chaining, the array is modified in place
}
实例:

const arr=[13,6075,51];
功能交换(arr,索引){
移除常数=阵列拼接(0,索引);
arr.push(…已移除);
返回arr;
}
log(swap([13,6075,51],1));

log(swap([13,6075,51],2))一种方法是通过
splice
执行删除操作,这将为您提供一个已删除内容的数组,然后使用
push
将这些内容添加回末尾:

function swap(arr, index) {
    const removed = arr.splice(0, index);
    arr.push(...removed);
    return arr; // Just for chaining, the array is modified in place
}
实例:

const arr=[13,6075,51];
功能交换(arr,索引){
移除常数=阵列拼接(0,索引);
arr.push(…已移除);
返回arr;
}
log(swap([13,6075,51],1));

log(swap([13,6075,51],2))您可以更改数组的长度并获取移动值

最后将长度改回原来的长度

函数移动(数组、索引){
常数l=数组长度;
array.length+=索引;
数组.copyWithin(l,0,索引);
数组.copyWithin(0,索引,索引+l);
array.length=l;
}
常量数组=[13,6075,51];
移动(数组,1);

log(…数组)您可以更改数组的长度并获取移动值

最后将长度改回原来的长度

函数移动(数组、索引){
常数l=数组长度;
array.length+=索引;
数组.copyWithin(l,0,索引);
数组.copyWithin(0,索引,索引+l);
array.length=l;
}
常量数组=[13,6075,51];
移动(数组,1);

log(…数组)
您可以使用
.slice
two获取这两部分,并使用
.concat
返回结果:

const swapPartsAtIndex=(arr=[],index=-1)=>{
if(index=arr.length)返回arr;
返回arr.slice(索引,arr.length).concat(arr.slice(0,索引));
}
设arr=[0,1,2,3,4,5];
arr=swapartsatindex(arr,3);
console.log(…arr);
arr=SwapArtSatindex([0,1,2,3,4,5,6],3);

console.log(…arr)
您可以使用
.slice
two获取这两部分,并使用
.concat
返回结果:

const swapPartsAtIndex=(arr=[],index=-1)=>{
if(index=arr.length)返回arr;
返回arr.slice(索引,arr.length).concat(arr.slice(0,索引));
}
设arr=[0,1,2,3,4,5];
arr=swapartsatindex(arr,3);
console.log(…arr);
arr=SwapArtSatindex([0,1,2,3,4,5,6],3);
console.log(…arr)
constmyarray=[13,6075,51,44,67,78]
函数移位数组项(arr,索引){
常量移位项=arr.splice(0,索引)
返回arr.concat(移位条目)
}
log(shiftarray条目(myArray,3))
constmyarray=[13,6075,51,44,67,78]
函数移位数组项(arr,索引){
常量移位项=arr.splice(0,索引)
返回arr.concat(移位条目)
}
log(shiftarray条目(myArray,3))
这将完成以下工作:

const shiftArray = (array, idx) => array.concat(array.splice(0, idx));

shiftArray([13, 6075, 51], 1) //[6075, 51, 13]
shiftArray([13, 6075, 51], 2) //[51, 13, 6075]
这将完成以下工作:

const shiftArray = (array, idx) => array.concat(array.splice(0, idx));

shiftArray([13, 6075, 51], 1) //[6075, 51, 13]
shiftArray([13, 6075, 51], 2) //[51, 13, 6075]

请添加您的尝试。怎么了