关于在JavaScript中删除空子数组的困惑

时间:2019-12-20 04:16:34

标签: javascript arrays

我有一个大小为5的数组,在每个元素中,我都填充了一个相应的子数组,如下所示:

let equalSums = new Array(5);
    for (let i = 0; i < equalSums.length; i++) {
        equalSums[i] = new Array(5);
}
console.log(equalSums);
/*
[ [ , , , ,  ],
  [ , , , ,  ],
  [ , , , ,  ],
  [ , , , ,  ],
  [ , , , ,  ] ]
*/

在错误地查找等于给定数字的连续子数组(在本例中为3)之后,我将求和元素等于3的子数组推入此equalSum数组,现在看起来像这样:

[ [ , , , ,  ],
  [ , , , ,  ],
  [ , , , ,  ],
  [ , , , ,  ],
  [ , , , ,  ],
  [ 1, 2 ],
  [ 2, 1 ],
  [ 3 ] ]

问题是我想删除所有空子数组,然后执行以下操作:

let rs = equalSums.filter(e => e.every(x => x != ""));
console.log(rs);
/* 
[ [ , , , ,  ],
  [ , , , ,  ],
  [ , , , ,  ],
  [ , , , ,  ],
  [ , , , ,  ],
  [ 1, 2 ],
  [ 2, 1 ],
  [ 3 ] ]
/*

还是一样,它不会删除空的子数组。

但是,我改用some,它给了我想要的结果:

let rs = equalSums.filter(e => e.some(x => x != ""));
console.log(rs);
/*
[ [ 1, 2 ], [ 2, 1 ], [ 3 ] ]
*/

有人可以为我解释为什么every不起作用而some起作用吗?

2 个答案:

答案 0 :(得分:0)

您在那里拥有的稀疏[,,,,]数组实际上没有 no 元素,只有没有任何内容的空格。

因此[,,,,,].every(x => x != '')问,“此数组的所有元素是否不等于""?”答案是肯定的。它没有元素,因此它拥有的所有元素(无)都不等于""

[,,,,].some(x => x != "")问道:“此数组是否包含不等于""任何个元素?”答案是否定的。它没有元素,因此没有不等于""的元素。

您还没有真正解释为什么要使用所有这些稀疏数组,我怀疑您可能会以错误的方式进行任何尝试,但是至少这可以解释{ {1}}和every

答案 1 :(得分:0)

请注意,[,,,]被认为是空数组,并且在使用everysome时,其行为与[]相同,即使它的长度为4。 more info on that

如果在空数组上调用

everysome会返回不同的值。

[].every(x => x)
true
[].some(x => x)
false

您的代码似乎依赖此行为来过滤出空数组,您的检查x != ""并不是过滤的工作。