Соедините массив пополам, независимо от размера?

У меня есть массив, который я хотел бы разделить пополам. Поэтому я могу позиционировать первую половину с правой стороны, а вторую половину - с левой стороны.

Я использовал функцию сращивания до:

var leftSide = arrayName.splice(0,2);

Но не уверен, как объединить его пополам, независимо от размера, потому что массив будет динамически изменяться.

Ответ 1

var half_length = Math.ceil(arrayName.length / 2);    

var leftSide = arrayName.splice(0,half_length);

отредактировал код, следующий за @Lightness Races в комментарии Orbit

Ответ 2

Избегайте мутаций

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

Использовать фрагмент

Вы можете обойти это, используя slice вместо splice

пример

let yourArray = props.someArray;
let halfWayThough = Math.floor(yourArray.length / 2)

let arrayFirstHalf = yourArray.slice(0, halfWayThough);
let arraySecondHalf = yourArray.slice(halfWayThough, yourArray.length);

Ответ 3

Вы можете просто ссылаться на длину массива:

var leftSide = arrayName.splice(0, Math.floor(arrayName.length / 2));

Поскольку .splice() фактически удаляет элементы из исходного массива, остальные элементы в массиве будут элементами для правой половины.

Math.floor() будет округлен, чтобы дать левой стороне меньше правой части для нечетных длин. Вы можете использовать Math.ceil() если хотите округлить, чтобы левая сторона была больше, чем правая, когда длина нечетная.

Ответ 4

let leftSide = myArray.splice(0, Math.ceil(myArray.length / 2));
//The right side is stored in "myArray"

Например:

let letters = ['a', 'b', 'c', 'd', 'e'];
let leftSide = letters.splice(0, Math.ceil(letters.length /2));
let rightSide = letters;
console.log(leftSide);
=> ['a', 'b', 'c']
console.log(rightSide);
=> ['d', 'e']

Дополнительная информация: splice в документах MDN


Обратите внимание, что это изменяет исходный массив. Если вы хотите сохранить исходный массив, клонируйте массив, а затем используйте сплайсинг в клонированном массиве. Из вопроса SO о клонировании массивов:

Был поток huuuge BENCHMARKS, содержащий следующую информацию:

  • Для blink-браузеров slice() - самый быстрый метод, concat() немного медленнее, а while - в 2,4 раза медленнее.

  • для других браузеров while цикл является самым быстрым методом, поскольку эти браузеры не имеют внутренних оптимизаций для slice и concat.

//Fastest for Blink browsers (Opera/Chromium):
let clonedArray = originalArray.slice();
//For other browsers:
let clonedArray = [];
var i = myArray.length;
while (i--) clonedArray[i] = myArray[i];

Ответ 5

Взгляните на chunk lodash:

var myArray = [1, 2, 3, 4, 5, 6, 7, 8];
var pivot = _.ceil(myArray.length / 2);
// => 4
console.log(_.chunk(myArray, pivot));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

Ответ 6

Это интересная функция для избежания мутаций с опциями:

function splitArray({ alternate, array }) {
  const halfIndex = Math.ceil(array.length / 2) - 1;
  let firstArray = true;
  return array.reduce((res, item, index) => {
    if (firstArray) {
      res[0].push(item);
      if (alternate || index >= halfIndex) {
        firstArray = false;
      }
    } else {
      res[1].push(item);
      if (alternate) {
        firstArray = true;
      }
    }
    return res;
  }, [[], []]);
}

И вы можете назвать это альтернативным вариантом:

const myArray = [1,2,3,4,5,6,7,8];
const splitAlternate = splitArray({ alternate: true, array: myArray });
const splitNoAlternate = splitArray({ alternate: false, array: myArray });

console.log(myArray);
console.log(splitAlternate);
console.log(splitNoAlternate);

Ответ 7

если вы хотите, чтобы размер массива оставался равным, вам просто нужно чередовать тот массив, в который вы пишете (например, чередуйте вызовы.push на массивах). Почему бы вам просто не создать 2 массива впереди?

var lelftHalf = yourArray.splice(0,arrayName.length / 2);

После этого, если вы хотите сохранить 2 массива одинакового размера, чередуйте

leftHalf.push(newElement);

а также

yourArray.push(newElement1);

Ответ 8

Вы также можете использовать ES6 для уничтожения и slice(), чтобы исходный массив не был видоизменен.

   const yourArray;
   let leftSide,rightSide;
   const m = Math.floor(yourArray.length/2);
   const [leftSide,rightSide] = [yourArray.slice(0,m), yourArray.slice(m,yourArray.length)];
   console.log(leftSide);
   console.log(rightSide);