最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Selectively push items to an array - Stack Overflow

programmeradmin0浏览0评论

So if I had:

A=['a','b','c'];
B=[];

for (var i = 0;i<7;i++){
   B.push(A[i])
}

I would get

B=["a", "b", "c", undefined, undefined, undefined, undefined]

Instead I want

B= ["a","b","c"]

So I guess I would need something like

for (var i = 0;i<7;i++){
   B.push(A[i] "unless A[i] is undefined. Then don't push anything")
}

How would I do this in Javascript?

So if I had:

A=['a','b','c'];
B=[];

for (var i = 0;i<7;i++){
   B.push(A[i])
}

I would get

B=["a", "b", "c", undefined, undefined, undefined, undefined]

Instead I want

B= ["a","b","c"]

So I guess I would need something like

for (var i = 0;i<7;i++){
   B.push(A[i] "unless A[i] is undefined. Then don't push anything")
}

How would I do this in Javascript?

Share Improve this question edited May 8, 2014 at 23:12 Andy G 19.4k5 gold badges48 silver badges69 bronze badges asked May 8, 2014 at 23:02 BigBoy1337BigBoy1337 4,97318 gold badges77 silver badges153 bronze badges 7
  • 3 I believe you are looking for array.length. Where did you get 7 from? – 13ruce1337 Commented May 8, 2014 at 23:05
  • 2 Also, what if A = ['a', undefined, 'b']? What if A = ['a',, 'b']? Note that these two cases are subtly different. – Jon Commented May 8, 2014 at 23:07
  • umm, I would ideally be looking to forgo the push in every undefined case, regardless of order. I think the second case is a slightly different problem but probably has a similar solution. – BigBoy1337 Commented May 8, 2014 at 23:13
  • 2 @Daniel: If you have an undefined element then the array has the property e.g. "1" and its value is undefined. If you skip it completely then the array does not have the property "1", even though A[1] still evaluates to undefined (for the same reason that A["lalalala"] also evaluates to undefined). jsfiddle.net/f8g6S – Jon Commented May 8, 2014 at 23:17
  • 2 @Jon Wow that's crazy, thanks. For other's reference, this can be checked by using the in operator (KEY in ARRAY) or hasOwnProperty(prop) method of the array. – Daniel Commented May 8, 2014 at 23:31
 |  Show 2 more comments

11 Answers 11

Reset to default 10

Some ES magic

    [1, 2, undefined].filter(Boolean)

will produce [1, 2]

I think this is what you're searching:

Array#filter

B = A.filter(function (element) {
    return element !== undefined;
});

That Code will make a duplicate of A filtering out all undefined elements.

Instead of iterating the array and pushing elements one at a time to a new array, it's usually more efficient to use the Array.filter function, like so:

var B = A.filter(function(item){ return item !== undefined; });

You may also want to be cautious about using undefined. This is easily confused with other constructs such as null or empty strings. If you use "!=" instead of "!==" in the function, that will filter out null or missing array items, as well as items which are set specifically as undefined.

You could add a safeguard like

A[i] && B.push(A[i])

which would only push if A1 returns a true, but that would also give false if A[i] would be 0

Example


I would suggest checking against null

 if (A[i] != null) B.push(A[i])

Example


If you want to keep your first forloop as it is you can "clean" the array after by using filter. Like:

for (var i = 0; i < 7; i++) {
    B.push(A[i])
}
var clean_B = B.filter(function (item) {
    return item != null;
});

Example

An Object Oriented Aspect

=> After that code, clean your array :

B.clean(); 

Known that clean is an extension of array Class(OOP context)

Array.prototype.clean=function(){
    var newArray = [];
    for(var index = 0; index < this.length; index++) {
        if(this[index]) {
            newArray.push(this[index]);
        }
    }
    return newArray;
};

You stated the answer to your question in your sort-of comment (use // at the end of the line next time, no need for inserting a comment in a string).

unless A[i] is undefined. Then don't push anything

Another way of putting it is, if A[i] is not undefined, then push.

When put like that, it directly translates into code.

if (A[i] !== undefined)
{
    B.push(A[i]);
}

I elaborated on your comment to show you how easily you can figure these types of questions out with a little effort and time.

However, as others have stated, a much better way of ignoring undefined indices is to simply iterate to A.length, however this only works if there are no undefined values in-between the defined values (which is still likely the case).

Your problem would be solved by iterating from 1 to array.length, or by using a for in loop

If you're going to be dealing with arrays that could have undefined elements, for example [0, undefined, 4], then you'd need to check if the element is defined before you add it. if(a[i] !== undefined) will do the trick.

You would use an if statement

for (var i = 0; i < 7; i++){
    if (A[i] !== undefined) {
        B.push(A[i]);
    }
}

You can have a compact function to filter out undefined values:

function compact(col) {
  return col.filter(function(val) {
    return val !== undefined;
  });
}

console.log(compact([false,0,1,null,undefined])); // [false,0,1,null]

JS Bin Example

http://jsbin.com/mabowana/4/edit

initials:

A = ['a', 'b', 'c'];
B = [];

I think, the closest answer to OP's question would be this:

for (var i = 0; i < 7; i++) {
   if (typeof A[i] !== "undefined") B.push(A[i]);
   else continue;
}

or this one:

for (elem of A) if (typeof elem !== "undefined") B.push(elem); else continue;

Instead of hard coding i < 7, use i < A.length

for (var i = 0; i < A.length; i++){
   B.push(A[i])
}
发布评论

评论列表(0)

  1. 暂无评论