我试图压扁阵列,但我遇到了困难。
我的代码:
var arr = [["2"],["3", "4"], "5", [["6"], ["7"]] ];
var res = [].concat.apply([], arr);
//Using reduce(ES5)
function test(args){
var sum = args.reduce(function(acc, val){
acc.concat(Array.isArray(val)? test(val): val);
});
}
//Regular implementation
function test2(arr){
var result = [];
arr.forEach(function(val){
if(Array.isArray(val)){
result = [].concat.apply([], val);
} else {
result.concat(val);
}
});
return result;
}
console.log(test(arr));
console.log(test2(arr));

预期产出:
["2", "3", "4","5", "6", "7"]
有人可以告诉我哪里出错了吗?
答案 0 :(得分:5)
多数民众赞成。这么简单
var arr = [["2"], ["3", "4"], "5", [["6"], ["7"]]];
function test2(arr) {
return arr.toString().split(",");
}
console.log(test2(arr));
答案 1 :(得分:4)
由于它是嵌套结构,因此您应该使用recursion
var arr = [["2"],["3", "4"], "5", [["6"], ["7"]] ];
function getFlattenArray(array){
var _tmp = [];
array.forEach(function(item){
if(Array.isArray(item)) {
_tmp = _tmp.concat(getFlattenArray(item))
}
else{
_tmp.push(item);
}
})
return _tmp;
}
var result = getFlattenArray(arr);
console.log(result)
var arr = [["2"],["3", "4"], "5", [["6"], ["7"]] ];
function getFlattenArray(array){
return array.reduce(function(p,c){
if(Array.isArray(c)) {
p = p.concat(getFlattenArray(c))
}
else{
p.push(c);
}
return p
}, [])
}
var result = getFlattenArray(arr);
console.log(result)
ES6版本
var arr = [["2"],["3", "4"], "5", [["6"], ["7"]] ];
function getFlattenArray(array){
return array.reduce((p,c) => (Array.isArray(c) ? p=p.concat(getFlattenArray(c)) : p.push(c) ) && p, [])
}
var result = getFlattenArray(arr);
console.log(result)
答案 2 :(得分:1)
我认为我链接你的代码不起作用的原因是你可能犯了同样的错误。我相信(如果我错了,我真的不在意,有人会纠正我),箭头功能会自动返回最后一行,所以在将代码转换为ES5时你会忘记返回arr.reduce(...)
这适用于我,Windows上的Chrome。
var arr = [
["2"],
["3", "4"], "5", [
["6"],
["7"]
]
];
function flatten(arr) {
return arr.reduce(function(acc, val) {
return acc.concat(Array.isArray(val) ? flatten(val) : val);
}, []);
}
console.log(flatten(arr));

答案 3 :(得分:1)
var arr = [["2"],["3", "4"], "5", [["6"], ["7"]] ];
var flatten = arr.flat(Infinity);
console.log(flatten);
由于Array.prototype.flat()
已包含在标准ECMAScript 2019(ES10)中,因此无需实现自己的方法即可展平数组。
flat
方法可以使用参数来指定嵌套数组结构应展平的深度。在上面的示例中,我传递了全局范围变量Infinity
,因此它展平了所有级别。
在撰写本文时(04/11/2019),除Edge以外,所有主流浏览器均已在其较新版本中实现了该功能。 Babel 7.4.0(带有core-js @ 3)也附带了。