如何从“null”和“undefined”值过滤嵌套数组?

时间:2014-07-09 23:27:55

标签: javascript arrays for-loop filter

如果我有一个JSON数组:

arrays = 
   [
      [
         undefined,
         ",",
         " ",
         "simple"
      ],
      [
         undefined,
         null,
         " ",
         "phrase"
      ],
      [
         undefined,
         ",",
         " ",
         "one"
      ],
      [
         undefined,
         null,
         " ",
         "another"
      ],
      [
         undefined,
         null,
         " ",
         "phrase"
      ]
   ]

我要根据undefinednull值进行过滤:

arrays.forEach(function(array){array.filter(function(n){return !!n})});

arrays.forEach(function(array){array = array.filter(function(n){return !!n})});

但它返回相同的数组而没有任何更改。

否则,如果我直接使用内部数组,它可以工作:

rest_words[0].filter(function(n){return !!n});
=> [",", " ", "simple"]

为什么forEach()不允许修改数组?它只是按值迭代吗?通过迭代修改数组的最佳解决方案是什么?

我希望有更多东西可以通过for(i=0, i<arrays.length, i++){arrays[i] = arrays[i].filter(...)}

进行迭代

3 个答案:

答案 0 :(得分:4)

您只在那里分配本地array变量,而不是写入实际的arrays属性。你可以做到

arrays.forEach(function(array, i, all) {
    all[i] = array.filter(Boolean); // where all===arrays
});

但是使用map创建新数组会更好:

refinedArrays = arrays.map(function(array) {
    return array.filter(Boolean);
});

答案 1 :(得分:2)

使用Array.map()

arrays = arrays.map(function(array) {
    return array.filter(function(n){ return n != null; });
});

我使用了n != null,除了nullundefined之外,它会保留任何值。而!!n也会排除""0

答案 2 :(得分:1)

试试这个:

arrays.forEach(function(array, index){
  arrays[index] = array.filter(function(n){return !!n});
});