2017-07-05 137 views
2

我想挑选数组中的元素,将它移动到另一个索引,然后将“中间”元素“移动/旋转”1个。更改数组中的元素位置并移动元素

想象一下拖放功能,如果索引from小于索引to,那么我想转向左侧,否则转向右侧。

输入:

let data = [ 0, 1, 2, 3, 4, 5, 6 ]

任务1: insertAndShift(data, 0, 3): Take element at index 0, shift indexes 1, 2, 3 to the left, and then insert index 0 at 3

预期输出:

[ 1, 2, 3, 0, 4, 5, 6 ]

任务2: insertAndShift(data, 3, 0) Take element at index 3, shift indexes 0, 1, 2 to the right and then insert index 3 at 0

预期输出:

[ 0, 1, 2, 3, 4, 5, 6 ]

我尝试这样做:

Rotating an array in place,丑陋和不工作的代码(温度总是不确定+结果不完成+可能的工作只适用于右):

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; 
} 

也是继Javascript (dynamic) insert into array, then shift all elements underneath +1,返回只有1项:

else 
{ 
    let result = data.splice(to, 1, data[from]); 
    this.setState({allTasksArray: result}) 
} 

我怎样才能做到这两个左,右?

+0

的第二个示例您预期的输出应该是3 ,0,1,2,4,5,6 ..? – EricG

+0

@EricG如果我将函数应用于** Task1的结果**而不是最初的数据(这是我在OP中的意思) –

回答

3

您可以使用Array.prototype.splice切出你想要的元素并插入在期望指数(换挡会自动发生):

function insertAndShift(arr, from, to) { 
 
    let cutOut = arr.splice(from, 1) [0]; // cut the element at index 'from' 
 
    arr.splice(to, 0, cutOut);   // insert it at index 'to' 
 
} 
 

 

 

 
let data = [ 0, 1, 2, 3, 4, 5, 6 ]; 
 

 
insertAndShift(data, 0, 3); 
 
console.log("[" + data + "]"); 
 

 
insertAndShift(data, 3, 0); 
 
console.log("[" + data + "]");