Javascript 有选择地将项目推送到阵列
如果我有:Javascript 有选择地将项目推送到阵列,javascript,arrays,Javascript,Arrays,如果我有: A=['a','b','c']; B=[]; for (var i = 0;i<7;i++){ B.push(A[i]) } 相反,我想要 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") } for(var i=0;i您将使用if语句 for (var i =
A=['a','b','c'];
B=[];
for (var i = 0;i<7;i++){
B.push(A[i])
}
相反,我想要
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")
}
for(var i=0;i您将使用if语句
for (var i = 0; i < 7; i++){
if (A[i] !== undefined) {
B.push(A[i]);
}
}
for(变量i=0;i<7;i++){
如果(A[i]!==未定义){
B.推(A[i]);
}
}
使用i
for (var i = 0; i < A.length; i++){
B.push(A[i])
}
for(变量i=0;i
您在注释中说明了问题的答案(下次在行尾使用/
,无需在字符串中插入注释)
除非[i]未定义,否则不要推送任何内容
另一种说法是,如果[i]未定义,则按
当这样放置时,它直接转换为代码
if(A[i]!==未定义)
{
B.推(A[i]);
}
我详细阐述了你的评论,向你展示了你是多么容易地通过一点努力和时间就能解决这些类型的问题
然而,正如其他人所说,忽略未定义索引的更好方法是简单地迭代到a.length
,但是这仅在定义值之间没有未定义的值时才有效(这种情况仍然可能发生)。通过从1迭代到array.length,或者使用
如果您要处理可能有未定义元素的数组,例如[0,未定义,4]
,那么您需要在添加元素之前检查元素是否已定义。如果(a[i]!==undefined)
就可以了。面向对象方面
=>完成该代码后,清理阵列:
B.clean();
已知clean是array类(OOP上下文)的扩展
Array.prototype.clean=function(){
var newArray=[];
对于(var index=0;index
我想这就是您要搜索的内容:
该代码将复制一个过滤掉所有未定义元素的函数。使用该函数通常更有效,而不是迭代数组并一次将一个元素推送到新数组中,如下所示:
var B = A.filter(function(item){ return item !== undefined; });
您可能还需要谨慎使用未定义的。这很容易与其他构造(如null或空字符串)混淆。如果使用“!=”而不是“!=”在函数中,它将过滤掉空的或缺少的数组项,以及专门设置为未定义的项。您可以使用一个紧凑的函数来过滤掉未定义的值:
function compact(col) {
return col.filter(function(val) {
return val !== undefined;
});
}
console.log(compact([false,0,1,null,undefined])); // [false,0,1,null]
jsbin示例
您可以添加一个保护装置,如
A[i] && B.push(A[i])
只有当A返回true
时才会推送,但如果A[i]
为0
我建议检查null
if (A[i] != null) B.push(A[i])
如果要保持第一个for
循环的原样,可以使用过滤器“清理”阵列。例如:
for (var i = 0; i < 7; i++) {
B.push(A[i])
}
var clean_B = B.filter(function (item) {
return item != null;
});
for(变量i=0;i<7;i++){
B.推(A[i])
}
var clean_B=B.过滤器(功能(项目){
退货项目!=空;
});
姓名首字母:
我认为,与OP的问题最接近的答案应该是:
for (var i = 0; i < 7; i++) {
if (typeof A[i] !== "undefined") B.push(A[i]);
else continue;
}
有些是魔法
[1, 2, undefined].filter(Boolean)
将产生
[1,2]
我相信你在找。你从哪里得到7个呢?还有,如果A=['A',未定义,'b']
呢?如果A=['A','b']
?请注意,这两种情况有细微的不同。嗯,我理想的做法是放弃对每个未定义的情况进行推送,而不管顺序如何。我认为第二种情况是一个稍有不同的问题,但可能有类似的解决方案。@Daniel:如果您有一个未定义的
元素,则数组具有属性,例如“1”它的值是undefined
。如果完全跳过它,则数组没有属性“1”,即使A[1]
的计算结果仍然是undefined
(原因与A[“lalalalala”]
的计算结果也是undefined
)@Jon Wow这太疯狂了,谢谢。为了便于他人参考,可以使用in
操作符(在数组中输入)或hasOwnProperty(prop)来检查
数组的方法。多么简洁的解决方案。IE<9需要一个polyfill,但这绝对是最好的。IE…pffff…IE总是需要特殊处理,我们在德语中称之为“Extrawurst”:d但他不想过滤掉所有的假值。问题不是很清楚吗?是的,但它仍然会过滤掉所有的假值,因为现在它有一个bug。一旦修复了,这个答案将与其他两个答案相同。只是要清楚一点。[0',null,1,2,undefined]。filter(Boolean)
也会生成[1,2]
。我想强调一下,因为问题集中在剥离未定义的
for (var i = 0; i < 7; i++) {
B.push(A[i])
}
var clean_B = B.filter(function (item) {
return item != null;
});
A = ['a', 'b', 'c'];
B = [];
for (var i = 0; i < 7; i++) {
if (typeof A[i] !== "undefined") B.push(A[i]);
else continue;
}
for (elem of A) if (typeof elem !== "undefined") B.push(elem); else continue;
[1, 2, undefined].filter(Boolean)