const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const output = move(numbers, 3, -5);
console.log(output);
function move(array, index, offset) {
const output = [...array];
const element = output.splice(index, 1)[0];
output.splice(index + offset, 0, element)
return output;
}
第一行是数字数组。
在第二行,调用move函数时,我们传递了三个参数。
首先,数组本身称为数字。 其次,我们要移动的数字的索引(在示例中,我们有索引3,因此我们传递了数字4)。 最后,我们将偏移量设置为-5。负号表示我们将数字向左移动。 5表示5个职位。
但是正如您所看到的,在到达数组的开头之前,我们仅在数字4的左侧保留3个位置。在这种情况下,我们必须转到数组的末尾并向后计数。因此,我们正在寻找一个将原始数组转换为[1,2,3,5,6,7,8,4,9]的函数。 如您所见,数字4向左移动了3个位置,以到达数组的开头,然后从数组的末尾再移动了2个位置。
另一个需要澄清的例子。
比方说我们写:
const output = move(numbers, 1, -4);
在此示例中,我们希望数组(索引1)中的数字2向左移动4个位置。因此,我们应该得到[1、3、4、5、6、7、2、8、9]。
答案 0 :(得分:1)
当更新的索引小于0 或大于数组长度时,您需要处理一些极端情况。您可以尝试关注
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
function move(array, index, offset) {
const output = [...array];
const element = output.splice(index, 1)[0];
let updatedIndex = index + offset;
if(updatedIndex < 0) updatedIndex++;
else if (updatedIndex >= array.length) updatedIndex -= array.length;
output.splice(updatedIndex, 0, element);
return output;
}
console.log(move(numbers, 3, -5));
答案 1 :(得分:0)
您可以使用while
循环并迭代要移动到的位置的Math.abs()
,然后根据参数的正负来进行移动。
function move(arr, i, p) {
let left = p < 0,
counter = Math.abs(p),
newPos = i;
while (--counter > -1) {
newPos = (left ? (newPos - 1) : (newPos + 1));
if (newPos == -1) newPos = arr.length - 1;
if (newPos == arr.length) newPos = 0;
if (counter == 0) arr.splice(newPos, 0, arr.splice(i, 1)[0])
}
return arr;
}
console.log(move([1, 2, 3, 4, 5, 6, 7, 8, 9], 3, -5));
console.log(move([1, 2, 3, 4, 5, 6, 7, 8, 9], 5, 5));
console.log(move([1, 2, 3, 4, 5, 6, 7, 8, 9], 1, -25));