【发布时间】:2014-05-20 03:52:43
【问题描述】:
我有这个数组:
array = ['bla', ['ble', 'bli'], 'blo', ['blu']]
我希望它是
array = ['bla', 'ble', 'bli', 'blo', 'blu']
有没有一个简单的函数可以给我这个特定的结果?
【问题讨论】:
标签: javascript arrays
我有这个数组:
array = ['bla', ['ble', 'bli'], 'blo', ['blu']]
我希望它是
array = ['bla', 'ble', 'bli', 'blo', 'blu']
有没有一个简单的函数可以给我这个特定的结果?
【问题讨论】:
标签: javascript arrays
2020 年更新:
您现在可以在几乎所有现代浏览器中使用.flat()(IE 是一个例外)。
var newArray = arr.flat([depth])
let result = ['bla', ['ble', 'bli'], 'blo', ['blu']].flat()
console.log(result);
result = ['bla', ['ble', ['bli', ['bom']]], 'blo', ['blu']].flat()
console.log(result);
result = ['bla', ['ble', ['bli', ['bom']]], 'blo', ['blu']].flat(2)
console.log(result);
result = ['bla', ['ble', ['bli', ['bom']]], 'blo', ['blu']].flat(Infinity)
console.log(result);
您可以使用concat 来执行此操作:
array = [].concat.apply([], array)
如果您需要递归执行(嵌套嵌套数组),我可能会这样做:
function flatten(arr, result) {
if (typeof result === "undefined") {
result = [];
}
for (var i = 0; i < length; i++) {
if (Array.isArray(arr[i])) {
flatten(arr[i], result);
} else {
result.push(arr[i]);
}
}
return result;
}
【讨论】:
['bla', ['ble', ['bli']], 'blo', ['blu']] 产生 ['bla', 'ble', ['bli'], 'blo', 'blu']
有一个名为 flat 的新数组原型函数。目前,微软浏览器和三星互联网不支持此功能。语法很简单:
array.flat([depth])
depth 是一个可选变量,用于指定要展平的层数。默认值为 1。阅读更多信息here。
【讨论】:
编辑:请查看 Dave 的答案或 p.s.w.g 的答案 - 它们更胜一筹。这段代码太可怕了,不应该使用(我无法删除已接受的答案)。
你可以这样做:
var arr = ['bla', ['ble', 'bli'], 'blo', ['blu']];
var newArr = arr.toString().split(',');
解释:
这很简单。 toString() 在包含数组的数组上创建一个字符串,其中所有元素都位于顶层,因此[['abc']].toString() 无论数组有多“深”都会产生“abc”。之后,您只需使用String.prototype.split 将输入的字符串拆分为一个数组,您就完成了目标
【讨论】:
已经提供的其他答案很好,但这是我的递归方法的实现,它将任意嵌套到任何深度的数组展平:
var flatten = function(arr) {
var out = [];
for(var i = 0; i < arr.length; i++) {
out.push.apply(out, Array.isArray(arr[i]) ? flatten(arr[i]) : [ arr[i] ]);
}
return out;
};
请注意,这依赖于 Array.isArray,它在旧版浏览器中可能不可用。如果这是一个问题,您可以用另一个数组测试替换它(例如arr[i].constructor == Array)
【讨论】: