有选择地将项目推送到数组

时间:2014-05-08 23:02:55

标签: javascript arrays

所以,如果我有:

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

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

我会得到

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

相反,我想要

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

所以我想我需要像

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

我如何在Javascript中执行此操作?

11 个答案:

答案 0 :(得分:2)

我认为这就是你要搜索的内容:

Array#filter

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

该代码将复制A过滤掉所有未定义的元素。

答案 1 :(得分:2)

不是迭代数组并将元素一次推送到新数组,而是使用Array.filter函数通常更有效,如下所示:

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

您可能还需要谨慎使用 undefined 。这很容易与其他构造混淆,例如 null 或空字符串。如果在函数中使用“!=”而不是“!==”,那么将过滤掉null或缺少的数组项,以及专门设置为undefined的项。

答案 2 :(得分:1)

您在评论中说明了问题的答案(下次使用//时,不需要在字符串中插入注释)。

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

另一种表达方式是if A[i] is not undefined, then push

当这样说时,它会直接转换为代码。

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

我详细阐述了您的评论,向您展示如何轻松地用一点点努力和时间来解决这些类型的问题。

然而,正如其他人所说,忽略未定义索引的一种更好的方法是简单地迭代到A.length,但这仅在定义值之间没有未定义值时才有效(这仍然可能案件)。

答案 3 :(得分:1)

面向对象的方面

=&GT;在那段代码之后,清理你的数组:

B.clean(); 

已知clean是数组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;
};

答案 4 :(得分:1)

一些ES魔法

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

会产生 [1, 2]

答案 5 :(得分:0)

您将使用if语句

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

答案 6 :(得分:0)

您的问题可以通过从1迭代到array.length或使用for in loop

来解决

如果您要处理可能包含未定义元素的数组,例如[0, undefined, 4],那么您需要在添加元素之前检查该元素是否已定义。 if(a[i] !== undefined)会做到这一点。

答案 7 :(得分:0)

您可以使用 compact 功能过滤掉undefined值:

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示例

<强> http://jsbin.com/mabowana/4/edit

答案 8 :(得分:0)

你可以添加像

这样的安全措施
A[i] && B.push(A[i])

只有在1返回true时才会推送,但如果A[i]0

,那也会失败

Example


我建议您查看null

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

Example


如果你想保持你的第一个for循环,你可以&#34;清洁&#34;通过使用过滤器后的数组。像:

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

Example

答案 9 :(得分:0)

缩写:

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

我认为,OP问题的最接近答案是 this

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

this 一:

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

答案 10 :(得分:-1)

使用i < 7

而不是硬编码i < A.length
for (var i = 0; i < A.length; i++){
   B.push(A[i])
}