Сортировка одномерного массива по индексам, указанным во втором единственном деменциальном массиве - JavaScript - PullRequest
1 голос
/ 03 августа 2020

Вот ситуация: мне нужна возможность переупорядочить любой одномерный массив, чтобы новый массив начинался с центрального номера (если количество объектов нечетное) или центральных двух чисел (если количество объектов четное) и повторял низкий , затем увеличивайте до тех пор, пока не будут учтены все числа в исходном массиве.

Пример 1 - нечетное количество объектов: Исходный массив: [1,2,3,5,8,13,20] Новый массив: [5 , 3,8,2,13,1,20]

Пример 2 - четное количество объектов: Исходный массив: [1,2,3,4] Новый массив: [2,3,1,4 ]

Я пробовал это с a for l oop и могу заставить его работать гипотетически, но я не могу использовать a for l oop в качестве вычисляемого свойства в Vue. js.

Вот моя попытка, которая не работает:

gameInfo: {
      cards: [1, 2, 3, 6, 8, 13, 21, 40, 1000],
    }

reorderOddCards() {
  ATTEMPT 1
  const cardCount = this.gameInfo.cards.length;
  const middleNumber = (cardCount / 2).toFixed(0);
  const newCardOrder = this.gameInfo.cards.map(addToArray);

  function addToArray(value, index) {
    if (index < middleNumber) {
      const newIndex = (((middleNumber - index) * 2) - 1);
      newCardOrder.splice(newIndex, 1, value);
    } else if (index === middleNumber) {
      newCardOrder.splice(index, 1, value);
    } else {
      const newIndex = ((middleNumber - index) * 2);
      newCardOrder.splice(newIndex, 1, value);
    }
  }

  return newCardOrder;
},

Вот, казалось бы, лучший подход с функцией .sort, но я тоже не могу заставить ее работать.

Возможное решение

1 Ответ

1 голос
/ 03 августа 2020

Этого можно добиться с помощью простого while l oop. Ключевым моментом здесь является поиск среднего индекса (ов). В массиве нечетной длины есть только один центр, который можно рассматривать как левый и правый центры в одной точке, чтобы обобщить решение. Этот индекс будет результатом деления длины пола на два. Правильный индекс всегда будет этим значением. Однако для массивов четной длины нам нужно уменьшить левый индекс на единицу. После вычисления этих индексов мы l oop уменьшаем левый индекс и увеличиваем правый индекс на единицу, чтобы добавить значения в наш результирующий массив.

function order(arr){
  let right = Math.floor(arr.length / 2);
  let left = right - (arr.length % 2 == 1 ? 0: 1);
  let res = left === right ? [arr[left]] : arr.slice(left, right + 1);
  while(left > 0){
    res.push(arr[--left]);
    res.push(arr[++right]);
  }
  return res;
}
console.log(...order([1,2,3,5,8,13,20]));
console.log(...order([1,2,3,4]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...