Переместить нули в массиве с помощью функций ES6 - PullRequest
0 голосов
/ 05 декабря 2018

Я новичок в ES6, пытаюсь создать функцию, которая перемещает все нули в массиве в последнюю позицию массива, сохраняя при этом первоначальный порядок массива, например, [1,0,0,0,2,3,4,5] => [1,2,3,4,5,0,0,0]

 function moveZeros (arr) {
  let zeroArr = [];
    for(let i = 0;i < arr.length;i++) {
    if (arr[i] == 0) {
     zeroArr.push(arr[i]);
     arr.splice(i, 1);
    }
  }
  arr.push(...zeroArr);
  return arr;
} 

Это мой код, он отлично работает, но я думаю, что это может быть короче при использовании некоторых функций ES6.Может кто-нибудь предложить лучшее решение

Ответы [ 5 ]

0 голосов
/ 05 декабря 2018

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

function moveZeroes(array) {
    return array.reduce((i => (r, v, j) => (r.splice(!v ? j : i++, 0, v), r))(0), []);
}

console.log(moveZeroes([1, 0, 0, 0, 2, 3, 4, 5]));
0 голосов
/ 05 декабря 2018

@ lucifer63 дал короткое и хорошее решение, но double not operator бесполезен и сбивает с толку, удалив его, вы получите улучшение:

const moveZeros = z => [...z.filter(a => a), ...z.filter(a => !a)]
moveZeros([1,0,0,0,2,3,4,5])
// [1, 2, 3, 4, 5, 0, 0, 0]
0 голосов
/ 05 декабря 2018

Вы можете использовать reduceRight, а если элемент равен 0, использовать push или, если это не 0, использовать unshift.

const arr = [1,0,0,0,2,3,4,5];
const res = arr.reduceRight((r, e) => (e === 0 ? r.push(e) : r.unshift(e), r), [])
console.log(res)
0 голосов
/ 05 декабря 2018

Как и просили в комментариях: как насчет sort?

arr.sort((a, b) => -!b)

Это, безусловно, менее производительный, но хелло короче

Старый

Onecompileman получил хорошее решение, но, поскольку OP хотел «более короткое» решение, я думаю, что мы можем уменьшить некоторые ненужные части:

const moveZeros = a => [...a.filter(x => !!x), ...a.filter(x => !x)]
0 голосов
/ 05 декабря 2018

Это легко решить с помощью функции filter и оператора spread.

const moveZeros = arr => {
  const z = arr.filter(a => a === 0); // get all zeroes
  const nZ = arr.filter(a => a !== 0); // get all non zeroes
  return [...nZ, ...z]; // put the zeroes on the last position
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...