我想在数组中选择一个元素,将其移动到另一个索引,然后将“中间”元素“转移/旋转”1次。
想象一下拖放功能,如果索引from
小于索引to
,则希望向左移动,否则向右移动。
输入:
let data = [0, 1, 2, 3, 4, 5, 6]
任务1:
insertAndShift(data,0,3):取出索引0处的元素,将索引1、2、3向左移动一个位置,然后将索引0插入到索引3处
期望输出:
[1, 2, 3, 0, 4, 5, 6]
任务2:
insertAndShift(data,3,0):取出索引3处的元素,将索引0、1、2向右移动一个位置,然后将索引3插入到索引0处
期望输出:
[0, 1, 2, 3, 4, 5, 6]
我尝试了这个:
根据旋转数组代码,丑陋且无法工作(temp始终未定义+结果不完整+可能仅适用于右侧):
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中动态插入数组,然后将下面所有元素都向下移动+1的问题,该问题仅返回了一个项目:
else
{
let result = data.splice(to, 1, data[from]);
this.setState({allTasksArray: result})
}
如何同时实现左右两侧?
Task1
的结果上应用函数 而不是初始的data
上(这就是我在 OP 中的意思),那么就不会出现这种情况。 - Khalil Khalaf