[SOLVED] Given an index, swap array elements accordingly

Issue

What I am trying to achieve is somewhat like a radio group behavior, where only one radio input can be selected at a time. For example, the starting array [0, 1, 1, 1, 1, 1] should have its elements swapped in the following way:

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]

I have come up with this, but I think it does "extra work" (unnecessary loops) in certain scenarios.

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;
}

I was wondering if you would have ideas on how to make this process simpler/better.

Solution

Just identify the previous 0 with findIndex, assign 1 to it, and assign 0 to the idx?

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

Another approach…

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

Answered By – CertainPerformance

Answer Checked By – Robin (BugsFixing Admin)

Leave a Reply

Your email address will not be published. Required fields are marked *