从Array中删除未定义的值

jAn*_*ndy 29 javascript arrays filter

在某些情况下,可能会发生我们在Array结构中具有undefined或通常为值的情况.例如,从数据库或HTML结构等未知来源读取和填充数据时.喜欢

var data = [42, 21, undefined, 50, 40, undefined, 9]
Run Code Online (Sandbox Code Playgroud)

因为在循环这些数组并处理元素时可能会造成麻烦,删除undefined(伪造值)的最佳做法是什么?

jAn*_*ndy 69

Array.prototype.filter这里使用可能是显而易见的.所以要删除我们可以调用的未定义值

var data = [42, 21, undefined, 50, 40, undefined, 9];

data = data.filter(function( element ) {
   return element !== undefined;
});
Run Code Online (Sandbox Code Playgroud)

如果我们想要过滤掉所有的假值(例如0或null),我们可以使用return !!element;.

但是我们可以通过将Boolean构造函数或构造函数分别传递Number.filter:

data = data.filter( Number );
Run Code Online (Sandbox Code Playgroud)

在这种情况下,这将完成工作,通常删除任何虚假值,我们会打电话

data = data.filter( Boolean );
Run Code Online (Sandbox Code Playgroud)

由于Boolean()构造函数返回truetruthy值和false任何falsy价值,这是一个非常整洁的选择.

  • 请注意`filter(Number)`也将删除`0`. (9认同)
  • 这也将删除可能存在于数组中的虚假值,例如`false` (3认同)
  • 这可以缩写为 `.filter(n=>n!==undefined)` (2认同)
  • 有人可能会感到困惑,所以:回调函数接收元素,这意味着执行“filter(Boolean)”与“filter((elem)=>Boolean(elem)”相同。 (2认同)

小智 55

内联使用lambda

result.filter(item => item);
Run Code Online (Sandbox Code Playgroud)

  • 这将删除所有错误值。由于OP指定的假值是不必要的,因此,这绝对是IMO的最佳答案。但是,您也要特别指出undefined,在那一点上您需要`result.filter(item => item!== undefined)` (3认同)
  • `[true,false,undefined,null,'a',1,0,'0']。filter(x => x)`返回`[true,“ a”,1,“ 0”] (2认同)

Yan*_*ich 20

data.filter(Boolean)
Run Code Online (Sandbox Code Playgroud)

是最简短且可读的方法。

  • 为什么这有效?不要只发布“魔法”,还要解释它是如何工作的以及为什么这是一个很好的解决方案。 (4认同)
  • @SeanMC这是另一个问题,关于打字稿。它与 array.filter 配合得不好。您可以在此处找到有关此主题的更多信息:/sf/ask/3010751621/ (2认同)

小智 14

ES6 单行

data.filter(e => e)
Run Code Online (Sandbox Code Playgroud)

  • 小心,这也会删除任何“虚假”值,例如零。`[undefined, null, 0, false].filter(e => e) // []` (2认同)

Dio*_*ela 13

如果您有一组对象并想删除所有nullundefined项目:

[].filter(item => !!item);
Run Code Online (Sandbox Code Playgroud)


Aka*_*han 8

您可以使用lodash compact方法,该方法去除nullundefined''

_.compact(data)
Run Code Online (Sandbox Code Playgroud)

  • 如果没有其他图书馆,就不能免费获得。这太过分了 (4认同)
  • 这可以工作并清理阵列。这是我更喜欢的解决方案 (2认同)

小智 7

正如 Diogo Capela 所说,但其中 0 也没有被过滤掉。

[].filter(item => item !== undefined && item !== null)
Run Code Online (Sandbox Code Playgroud)


Ani*_*nil 5

[NaN, undefined, null, 0, 1, 2, 2000, Infinity].filter(Boolean)
//[ 1, 2, 2000, Infinity ]
Run Code Online (Sandbox Code Playgroud)