admin管理员组

文章数量:1199479

I have very long array containing numbers. I need to remove trailing zeros from that array.

if my array will look like this:

var arr = [1,2,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];

I want to remove everything except [1, 2, 0, 1, 0, 1].

I have created function that is doing what is expected, but I'm wondering if there is a build in function I could use.

var arr = [1,2,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
for(i=arr.length-1;i>=0;i--)
{
    if(arr[i]==0) 
    {
        arr.pop();
    } else {
        break;
    }
}
console.log(arr);

Can this be done better/faster?

I have very long array containing numbers. I need to remove trailing zeros from that array.

if my array will look like this:

var arr = [1,2,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];

I want to remove everything except [1, 2, 0, 1, 0, 1].

I have created function that is doing what is expected, but I'm wondering if there is a build in function I could use.

var arr = [1,2,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
for(i=arr.length-1;i>=0;i--)
{
    if(arr[i]==0) 
    {
        arr.pop();
    } else {
        break;
    }
}
console.log(arr);

Can this be done better/faster?

Share Improve this question asked Aug 18, 2014 at 11:03 MisiuMisiu 4,91922 gold badges100 silver badges208 bronze badges
Add a comment  | 

6 Answers 6

Reset to default 18

Assuming:

var arr = [1,2,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];

You can use this shorter code:

while(arr[arr.length-1] === 0){ // While the last element is a 0,
    arr.pop();                  // Remove that last element
}

Result:

arr == [1,2,0,1,0,1]
var arr = [1,2,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];

var copy = arr.slice(0);
var len = Number(copy.reverse().join('')).toString().length;
arr.length = len;

arr -> [1, 2, 0, 1, 0, 1]

how it works

copy.reverse().join('') becomes "00000000000000000101021"

when you convert a numerical string to number all the preceding zeroes are kicked off

var len  = Number(copy.reverse().join('')) becomes 101021

now by just counting the number i know from where i have to remove the trailing zeroes and the fastest way to delete traling elements is by resetting the length of the array.

arr.length = len;

DEMO

const arr = [0,0,0,1,2,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];

My solution is:

arr.join('').replace(/0+$/g,'').split('').map(Number);

It will remove trailing zeros in the given array.

Result is [0,0,0,1,2,0,1,0,1];

If you also needed to remove leading zeros, you can adjust the regex like this:

arr.join('').replace(/^0+|0+$/g,'').split('').map(Number);

Now It will remove not only trailing zeros, but leading zeros too.

Result is [1,2,0,1,0,1];

Accepted answer is perfectly well. Just for fun here is a reducing approach.

var a = [1,0,1,0,1,0,1,2,3,4,5,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0];
    f = a => { var b = true;
               return a.reduceRight((r,n,i) => ( b ? n && ( b = false
                                                          , r[i] = n
                                                          )
                                                   : r[i] = n
                                               , r
                                               )         
                                   , []
                                   );
             };
console.log(f(a));

Here's a one-liner representing javascript at both its best and worst at the same time.

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

arr.slice(0,arr.reduceRight(([d,l],c) => [d||c,l-!(d||c)], [false,arr.length])[1])

Output:

[ 1, 2, 0, 1, 0, 1 ]

A simpler immutable approach using reduceRight

const arr = [1,2,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];

const prunedArray = arr.reduceRight((acc, item) => {
  if(item === 0 && acc.length === 0) {
    return acc;
  }
  return acc.concat(item);
}, []);

console.log(prunedArray); // [1, 0, 1, 0, 2, 1]

本文标签: javascriptremove trailing elements from array that are equal to zerobetter wayStack Overflow