Kha*_*laf 5 javascript arrays insert rotation shift
我想在数组中选择一个元素,将其移动到另一个索引,然后将"中间"元素"移位/旋转"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 ]
TASK2:
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 ]
我试过这个:
下面旋转一个数组,丑陋而不工作的代码(temp总是未定义+结果不完整+可能仅适用于RIGHT):
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;
}
Run Code Online (Sandbox Code Playgroud)
也可以按照Javascript(动态)插入到数组中,然后将所有元素移到+1下面,这只返回1个项目:
else
{
let result = data.splice(to, 1, data[from]);
this.setState({allTasksArray: result})
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现左右两种目的?
ibr*_*rir 16
您可以使用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 + "]");Run Code Online (Sandbox Code Playgroud)