如何将包含多个数组的数组压缩成一个包含所有元素的数组?

3
我有一个数组形式为:[[null,1,2,null],[9],[2,null,null]]
我想要一个简单的函数来返回[1,2,9,2],其中,如您所见,消除了 null。
我需要这个是因为数据库中的一些值以此形式返回,我将使用例子返回但不包含 null 来查询。
谢谢!

1
所以你想要完全展开这个数组并删除所有的 null 吗?这个数组是否总是仅有一层深度? - jamesplease
是的,总是只有一级深度。 - Discipol
3个回答

6
始终只有一层深度
var arr  = [ [ null, 1, 2, null ], [ 9 ], [ 2, null, null ] ],
    arr2 = [];

arr2 = (arr2.concat.apply(arr2, arr)).filter(Boolean);

FIDDLE


@Discipol - 移除了for循环 - adeneo
@Discipol,请注意,这也会删除undefined0和任何falsy值,这不是您要求的;您可能需要用n !== null替换!!n - Dan Heberden
我可以根据我的需要修改筛选函数 :D - Discipol
筛选器可以缩短为.filter(Boolean) - user2736012
@user2736012 - 那真的很酷,我不知道。将布尔值作为回调传递会使用数组值(n)作为参数调用 Boolean() 函数,而 Boolean(null) 评估为假,因此它被过滤器排除了。 - adeneo
显示剩余2条评论

4
假设可能存在嵌套的数组结构:
var reduce = function(thing) {

  var reduction = [];

  // will be called for each array like thing
  var loop = function(val) {

    // an array? 
    if (val && typeof val === 'object' && val.length) {
      // recurse that shi•
      reduction = reduction.concat(reduce(val));
      return;
    }

    if (val !== null) {
       reduction.push(val);
    }

  };

  thing.forEach(loop);

  return reduction;
};

reduce([ [ null, 1, 2, null ], [ 9 ], [ 2, null, null ] ]); 
// [1, 2, 9, 2]

reduce([1, 3, 0, [null, [undefined, "what", {a:'foo'}], 3], 9001]);
// [1, 3, 0, undefined, "what", Object, 3, 9001]

像这样吗?


2
你可以使用 LoDash 库来实现这个。

_.flatten()

将嵌套数组压平(可以是任意深度的嵌套)。

_.compact()

创建一个数组,其中删除了所有的假值。假值包括 false、null、0、""、undefined 和 NaN。
这里是 示例
var test = [
    [null, 1, 2, null],
    [9],
    [2, null, null]
];
test = _.flatten(test);
test = _.compact(test);
console.log(test)

输出: [1, 2, 9, 2]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接