JavaScript中如何用for循环输出完整数组?排查元素缺失问题
问题分析与解决方案
嘿,我来帮你理清楚问题出在哪!
你代码里的核心错误是误用了in操作符——它根本不是用来检查数组里有没有某个元素值的!
in操作符的作用是检查某个值是否是对象的属性名(对于数组来说,属性名就是它的索引,比如0、1、2这些数字)。举个具体的例子:
- 当你判断
0 in x时,其实是在问“x数组有没有索引为0的位置?”,而不是“x数组里有没有值为0的元素?”。 - 当x里已经有至少一个元素时,索引0肯定是存在的,所以当原数组里的元素是0时,
!(0 in x)就会返回false,自然不会把0push到x里。 - 同理,当原数组里的元素是1时,只要x的长度≥2(也就是索引1已经存在),
1 in x就会是true,也不会push这个1。这就是为什么你缺失了0、1、2这些刚好和x已有索引重合的元素。
那怎么解决呢?分两种情况看你的需求:
如果你只是想完整复制原数组(不需要去重)
那完全不需要那个判断条件,直接遍历push就行,甚至有更简单的方法:
var li = [5,9,17,14,1,0,4,19,11,6,8,13,10,2,18,15,16,3,12,7,20]; // 方法1:遍历push var x = []; for(var i = 0; i < li.length; i++){ x.push(li[i]); } // 方法2:ES6扩展运算符,更简洁 // var x = [...li]; // 方法3:slice方法,兼容性更好 // var x = li.slice(); console.log(x);
这样就能得到和原数组完全一样的结果。
如果你是想对数组去重(但要保留所有唯一元素)
那需要用正确的方法检查元素是否已经在x里,比如Array.includes():
var li = [5,9,17,14,1,0,4,19,11,6,8,13,10,2,18,15,16,3,12,7,20]; var x = []; for(var i = 0; i < li.length; i++){ // includes会直接检查数组中是否包含该元素值 if(!x.includes(li[i])){ x.push(li[i]); } } console.log(x);
因为你的原数组本身没有重复元素,所以运行后会输出和原数组完全一致的结果。如果原数组有重复元素,这个代码会自动去重。
另外,如果你需要兼容比较旧的浏览器,也可以用x.indexOf(li[i]) === -1来判断,效果是一样的。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

