移动元素在数组中的位置

时间:2018-10-17 08:13:29

标签: javascript arrays

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]。

2 个答案:

答案 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));