【发布时间】:2011-12-14 01:47:45
【问题描述】:
如何在 jQuery 中简单地展平数组?我有:
[1, 2, [3, 4], [5, 6], 7]
我想要:
[1, 2, 3, 4, 5, 6, 7]
【问题讨论】:
标签: javascript jquery arrays flatten
如何在 jQuery 中简单地展平数组?我有:
[1, 2, [3, 4], [5, 6], 7]
我想要:
[1, 2, 3, 4, 5, 6, 7]
【问题讨论】:
标签: javascript jquery arrays flatten
您可以使用jQuery.map,如果您已经加载了 jQuery 库,则可以使用此方法。
$.map( [1, 2, [3, 4], [5, 6], 7], function(n){
return n;
});
返回
[1, 2, 3, 4, 5, 6, 7]
【讨论】:
Array.prototype.map jQuery 的map 对从回调函数返回的数组有特殊处理:[callback] 函数可以返回任何值。返回的数组将被展平为结果数组
你可以使用jQuery.map():
callback(value, indexOrKey)处理每一项的函数 反对。函数的第一个参数是值;第二 参数是数组或对象属性的索引或键。这 函数可以返回任何值以添加到数组中。 返回的数组 将被展平为结果数组。在函数内,这 指的是全局(窗口)对象。
【讨论】:
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 中并运行它。
【讨论】:
obj instanceof Array 几乎可以正常工作。 (除非有另一个名为 Array 的变量,那么你可以使用obj instanceof [].constructor)
$.isArray。纯 js 很棒,但库也很好 =]。
使用 JavaScript 的强大功能:
var a = [[1, 2], 3, [4, 5]];
console.log( Array.prototype.concat.apply([], a) );
//will output [1, 2, 3, 4, 5]
【讨论】:
apply([], a)位吗? :)
以下是使用 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]
【讨论】:
老问题,我知道,但是...
我发现这是可行的,而且速度很快:
function flatten (arr) {
b = Array.prototype.concat.apply([], arr);
if (b.length != arr.length) {
b = flatten(b);
};
return b;
}
【讨论】:
要递归地展平数组,您可以使用本机 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 ]
【讨论】:
如果您有多个级别,请使用递归:
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);
【讨论】:
您可以使用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);
【讨论】:
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]
【讨论】: