55

如何在 jQuery 中简单地展平数组?我有:

[1, 2, [3, 4], [5, 6], 7]

而且我要:

[1, 2, 3, 4, 5, 6, 7]
4

10 回答 10

62

您可以使用jQuery.map,如果您已经加载了 jQuery 库,那么这是要走的路。

$.map( [1, 2, [3, 4], [5, 6], 7], function(n){
   return n;
});

退货

[1, 2, 3, 4, 5, 6, 7]
于 2011-10-24T11:43:10.743 回答
35

使用 JavaScript 的强大功能:

var a = [[1, 2], 3, [4, 5]];

console.log( Array.prototype.concat.apply([], a) );
//will output [1, 2, 3, 4, 5]
于 2011-10-24T11:52:31.063 回答
25

以下是使用 jquery 展平深度嵌套数组的方法:

$.map([1, 2, [3, 4], [5, [6, [7, 8]]]], function recurs(n) {
    return ($.isArray(n) ? $.map(n, recurs): n);
});

回报:

[1, 2, 3, 4, 5, 6, 7, 8]

利用jQuery.mapjQuery.isArray

于 2012-10-08T08:33:58.067 回答
11
var a = [1, 2, [3, 4], [5, [6, [7, 8]]]];
var b = [];

function flatten(e,b){
    if(typeof e.length != "undefined")
    {
        for (var i=0;i<e.length;i++)
        {
            flatten(e[i],b);
        }
    }
    else
    {
        b.push(e);
    }
}
flatten(a,b);
console.log(b);

flatten 函数应该可以做到,这不需要 jQuery。只需将所有这些复制到 Firebug 并运行它。

于 2011-10-24T11:49:15.507 回答
5

要递归地展平数组,您可以使用本机Array.reduce函数。不需要为此使用jQuery。

function flatten(arr) {
    return arr.reduce(function flatten(res, a) { 
        Array.isArray(a) ? a.reduce(flatten, res) : res.push(a);
        return res;
    }, []);
}

执行

flatten([1, 2, [3, 4, [5, 6]]])

返回

[ 1, 2, 3, 4, 5, 6 ]
于 2013-05-04T11:41:41.120 回答
4

您可以使用jQuery.map()

callback(value, indexOrKey)处理每个项目的函数。函数的第一个参数是值;第二个参数是数组或对象属性的索引或键。该函数可以返回任何值以添加到数组中。返回的数组将被展平为结果数组。在函数中,this 指的是全局(窗口)对象。

于 2011-10-24T11:49:03.493 回答
1

如果您有多个级别,请使用递归:

flaten = function(flatened, arr) {
    for(var i=0;i<arr.length;i++) {
        if (typeof arr[i]!="object") {
            flatened.push(arr[i]);
        }
        else {
            flaten(flatened,arr[i]);
        }
    }
    return;
}

a=[1,[4,2],[2,7,[6,4]],3];
b=[];
flaten(b,a);
console.log(b);
于 2014-10-16T06:19:25.470 回答
1

您可以使用Array.prototype.reduce它在技术上不是 jQuery,而是有效的 ES5:

var multidimensionArray = [1, 2, [3, 4], [5, 6], 7];
var initialValue = [];

var flattened = multidimensionArray.reduce(function(accumulator, current) {
    return accumulator.concat(current);
}, initialValue);

console.log(flattened);
于 2015-02-22T09:33:03.160 回答
0

老问题,我知道,但是...

我发现这很有效,而且速度很快:

function flatten (arr) {
  b = Array.prototype.concat.apply([], arr);
  if (b.length != arr.length) {
    b = flatten(b);
  };

  return b;
}
于 2012-11-28T02:13:45.893 回答
0

你需要arr.flat([depth])

var arr1 = [1, 2, [3, 4]];
arr1.flat(); 
// [1, 2, 3, 4]

var arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]

var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);
// [1, 2, 3, 4, 5, 6]
于 2019-07-06T11:11:39.970 回答