shen
shen

Reputation: 43

Move zeroes in array using ES6 features

I’m new to ES6, trying to make a function that moves all zeros in the array in the last position of the array while preserving the original order of the array E.g. [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;
} 

This is my code its works fine, but I think this can be shorter more in using some ES6 features. Can someone provide a better solution

Upvotes: 4

Views: 303

Answers (5)

lucifer63
lucifer63

Reputation: 666

As requested in comments: what about sort?

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

It is for sure less performant, but hella shorter

Old

Onecompileman got an ok solution, but as OP wanted 'shorter' solution, i think we can reduce some unnecessary parts:

const moveZeros = a => [...a.filter(x => !!x), ...a.filter(x => !x)]

Upvotes: 5

Nina Scholz
Nina Scholz

Reputation: 386560

You could reduce the array by splicing the result array either on the actual position or at an adjusted index, which counts the not null values.

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]));

Upvotes: 1

Mos&#232; Raguzzini
Mos&#232; Raguzzini

Reputation: 15821

@lucifer63 gave a short and good solution but the double not operator is both useless and confusing, removing it you'll get an improvement:

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]

Upvotes: 2

Nenad Vracar
Nenad Vracar

Reputation: 122037

You could use reduceRight and if the element is 0 use push or if its not 0 use 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)

Upvotes: 1

onecompileman
onecompileman

Reputation: 940

That can be solved easily using filter function and spread operator, .

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

Upvotes: 7

Related Questions