Javascript 更改元素在数组中的位置并在其间移动元素
我想在数组中选取一个元素,将其移动到另一个索引,然后将“中间”元素“移位/旋转”1 想象一下一个拖放功能,如果从到的索引Javascript 更改元素在数组中的位置并在其间移动元素,javascript,arrays,insert,rotation,shift,Javascript,Arrays,Insert,Rotation,Shift,我想在数组中选取一个元素,将其移动到另一个索引,然后将“中间”元素“移位/旋转”1 想象一下一个拖放功能,如果从到的索引小于索引到,那么我希望向左移动,否则向右移动 输入: let data=[0,1,2,3,4,5,6] 任务1: insertAndShift(数据,0,3):在索引0处获取元素,将索引1,2,3向左移动,然后在3处插入索引0 预期输出: [1,2,3,0,4,5,6] 任务2: insertAndShift(数据,3,0)在索引3处取元素,将索引0,1,2向右移动,然后在0处
小于索引到
,那么我希望向左移动,否则向右移动
输入:
let data=[0,1,2,3,4,5,6]
任务1:
insertAndShift(数据,0,3):在索引0处获取元素,将索引1,2,3向左移动,然后在3处插入索引0
预期输出:
[1,2,3,0,4,5,6]
任务2:
insertAndShift(数据,3,0)在索引3处取元素,将索引0,1,2向右移动,然后在0处插入索引3
预期输出:
[0,1,2,3,4,5,6]
我试过这个:
以下是难看且不工作的代码(温度始终未定义+结果未完成+可能的工作仅适用于右侧):
如何在左侧和右侧实现这一点?您可以使用来剪切所需的元素,并在所需索引处插入(移动将自动发生):
函数插入和移位(arr、from、to){
let cutOut=arr.splice(from,1)[0];//在索引“from”处剪切元素
arr.splice(to,0,cutOut);//将其插入索引“to”
}
让数据=[0,1,2,3,4,5,6];
insertAndShift(数据,0,3);
console.log(“[”+数据+“]”);
insertAndShift(数据,3,0);
console.log(“[”+数据+“]”)代码>上面的答案很好,但有点手工操作。。。如果您对一个解决方案感兴趣,该解决方案详细说明了它的功能,我写了以下内容:
const insertAndShift=(arr:number[],to:number,from:number)=>{
让newArray:number[]=[];
const fromItem=arr[from];
如果(从>到){
常数startto=(to>0)?arr.slice(0,to):[];
常数toToFrom=arr.slice(to,from);
常数fromToEnd=arr.slice(from+1,arr.length);
newArray=newArray.concat(startTo、[fromItem]、toToFrom、fromToEnd);
}
如果(到>从){
常量startToFrom=(from>0)?arr.slice(0,from):[];
常数fromToTo=arr.slice(从+1到+1);
常数toToEnd=arr.slice(至+1,arr.length);
newArray=newArray.concat(startToFrom、fromToToToTo、fromItem、toToEnd);
}
返回新数组;
};
常量数组=[0,1,2,3,4,5,6,7,8,9];
log(insertAndShift(数组,9,0));
log(insertAndShift(数组,5,1))代码>查看此方法:
有一种更有效的方法可以做到这一点:
函数insertAndShift(数据、src、dest){
如果(src==dest)
返回;
设tmp=data[src];
如果(srcdest)*/{
数据.copyWithin(dest+1,dest,src);
}
数据[dest]=tmp;
}
让数据=[0,1,2,3,4,5,6];
insertAndShift(数据,0,3);
console.log(“[”+数据+“]”);
insertAndShift(数据,3,0);
console.log(“[”+数据+“]”)
第二个示例的预期输出应该是3,0,1,2,4,5,6..@EricG如果我对Task1
的结果应用该函数,而不是初始数据(这是我在OP中的意思)添加了一点健全性检查,并针对TypeScript对其进行了调整,则不会如此,但前提相同!
insertAndShift(data, from, to)
{
if(from < to)
{
// rotate in between - LEFT
}
else
{
// swap elements
let temp = data[from];
data[from] = data[to];
data[to] = temp;
// rotate in between - RIGHT
let newData = this.rotate(data.slice(to, from - 1), 1)
let result = [];
result.push(data.slice(0,1));
newData.map((element) => result.push(element))
for(let i = from+1; i < data.length; i++)
{
result.push(data[i]);
}
this.setState({data: result})
}
}
rotate(arr, k) {
var l = arr.length;
arr = this.reverseArr(arr, 0, l - 1);
arr = this.reverseArr(arr, 0, k - 1);
arr = this.reverseArr(arr, k, l - 1);
return arr;
}
reverseArr(arr, left, right) {
while (left < right) {
var temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
return arr;
}
else
{
let result = data.splice(to, 1, data[from]);
this.setState({allTasksArray: result})
}