Метод, который принимает массив и перемещает все нули в конец, сохраняя порядок других элементов - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь понять, почему эта часть - arr.splice(index, 1).push(0) - моего кода не работает. почему я не могу соединить, а затем нажать?

var moveZeros = function (arr) { 
  const newArray = arr.map((element, index) => element === 0 ? arr.splice(index, 1).push(element) : console.log(index, element))
}

Ответы [ 3 ]

4 голосов
/ 03 октября 2019

Array.splice () возвращает массив элементов, которые удалены из массива, для которого был вызван splice (). Документацию можно найти здесь: Array.splice () документация

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

let arr = [1, 0, 2, 0, 1, 0, 1, 0, 1, 0]

var moveZeros = function (arr) {
    let zeroes = [];
    let a = arr.reduce((finalArray, element) => {
        element === 0 ? zeroes.push(element) : finalArray.push(element)
        return finalArray;
    }, []);
    return [...a, ...zeroes];
}

console.log(moveZeros(arr));
3 голосов
/ 03 октября 2019

splice возвращает массив удаленных элементов. Если вы делаете

arr.splice(index, 1).push(0)

, то вы перемещаетесь в массив удаленных нулей (и это выражение впоследствии впоследствии отбрасывается).

Вы также не должны изменять массив во время итерациииз-за этого - это приведет к очень запутанному поведению.

Рассмотрите возможность фильтрации нулей, вместо этого передавая массив нулей, а затем объединяйте два массива:

const moveZeros = (arr) => {
  const zeros = [];
  return arr
    .filter((elm) => {
      if (elm === 0) {
        zeros.push(0);
        return false;
      }
      return true;
    })
    .concat(zeros);
};

console.log(moveZeros([0, 1, 2, 3]));
console.log(moveZeros([3, 2, 1,0, 1, 2, 3]));
1 голос
/ 03 октября 2019

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

var array = [0, 1, 9, 2, 0, 0, 3, 5, 4, 2];

array.sort((a, b) => !a - !b);

console.log(array)
...