Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 更改元素在数组中的位置并在其间移动元素_Javascript_Arrays_Insert_Rotation_Shift - Fatal编程技术网

Javascript 更改元素在数组中的位置并在其间移动元素

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处

我想在数组中选取一个元素,将其移动到另一个索引,然后将“中间”元素“移位/旋转”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处插入索引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})
}