给定一个索引,相应地交换数组元素

Given an index, swap array elements accordingly

我想要实现的有点像无线电组行为,一次只能选择一个无线电输入。例如,起始数组 [0, 1, 1, 1, 1, 1] 应按以下方式交换其元素:

index array
0 [0, 1, 1, 1, 1, 1]
1 [1, 0, 1, 1, 1, 1]
2 [1, 1, 0, 1, 1, 1]
3 [1, 1, 1, 0, 1, 1]
4 [1, 1, 1, 1, 0, 1]
5 [1, 1, 1, 1, 1, 0]

我想到了这个,但我认为它在某些情况下会做“额外的工作”(不必要的循环)。

function rearrange(array: number[], idx: number) {
  let arr = array.slice();
  let l = arr.length;
  if (arr.indexOf(0) === idx) return arr;

  while (arr.indexOf(0) !== idx) {
    let swap;
    for (let i = 0; i < l; i++) {
      if (arr[i] === 0 || arr[i + 1] === 0) {
        swap = arr[i];
        if (i + 1 < l) {
          arr[i] = arr[i + 1];
          arr[i + 1] = swap;
        }
        if (i + 1 > l) {
          arr[i] = arr[i - 1];
          arr[i - 1] = swap;
        }
      }
    }
  }

  return arr;
}

我想知道您是否有关于如何进行此过程的想法simpler/better。

只要用findIndex识别前面的0,赋1给它,0赋给idx?

function rearrange(array: number[], idx: number) {
  const arr = [...array];
  arr[arr.indexOf(0)] = 1;
  arr[idx] = 0;
  return arr;
}

另一种方法...

const rearrange = (array: number[], idx: number) => (
  array.map((_, i) => i === idx ? 0 : 1)
);

您可以使用切片和拼接“一次性”旋转子阵列,而不是交换对。

这是一个完成这项工作的函数,它改变了给定的数组(不返回一个新数组),并用一系列调用来演示它。我假设值可能会发生变化并且需要保持在一起,就好像它们与“移动” 0:

交换一样

function rearrange(array, idx) {
  let zero = array.indexOf(0);
  if (zero < idx) {
      arr.splice(zero, idx - zero + 1, ...arr.slice(zero + 1, idx + 1), 0);
  } else {
      arr.splice(idx, zero - idx + 1, 0, ...arr.slice(idx, zero));
  }
}

arr = [0,1,2,3,4,5];

rearrange(arr, 3);
console.log(...arr);
rearrange(arr, 1);
console.log(...arr);
rearrange(arr, 5);
console.log(...arr);
rearrange(arr, 1);
console.log(...arr);