这是一个数组降维的方法,怎么修改让它实现多维数组降为一维数组呢?
Array.prototype.reduceDimension=function(){
var result=[];
return Array.prototype.concat.apply(result,this);
}
这是一个数组降维的方法,怎么修改让它实现多维数组降为一维数组呢?
Array.prototype.reduceDimension=function(){
var result=[];
return Array.prototype.concat.apply(result,this);
}
function flattenArray(multi) {
var i, length, ret = arguments[1] || [];
for (i = 0, length = multi.length; i < length; i++) {
item = multi[i];
if (Array.prototype.isPrototypeOf(item)) {
flattenArray(item, ret);
} else {
ret.push(item);
}
}
return ret;
}
// 设置原型链
Array.prototype.flatten = function() {
return flattenArray(this);
};
多维数组
var multi = [
'1.1',
['2.1', '2.2'],
[['3.1.1', '3.1.2'], ['3.2.1', '3.2.1']],
[[['4.1.1.1', '4.1.1.2'], ['4.1.1.2', '4.1.1.2']]],
];
调用示例
// 函数调用
flattenArray(multi);
// 方法调用
multi.flatten();
如果结构比较简单,可以直接使用reduce实现,复杂的可以参考楼上。
[[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
return a.concat(b);
});
function flattenWithDepth (array, result, depth) {
for (var i = 0; i < array.length; i++) {
var value = array[i]
if (depth > 0 && Array.isArray(value)) {
flattenWithDepth(value, result, depth - 1)
} else {
result.push(value)
}
}
return result
}
var arr = [1, [2,4,5,6],6 ,[5,[8,6,7,[9,12]]]];
var result = [];
console.log(flattenWithDepth(arr, result, 3));
多维数组不等于嵌套数组
多维数组的维数是已知的且固定的
function reduceDimension(arr, dimensions) {
var result = arr;
while (--dimensions > 0)
result = Array.prototype.concat.apply([], result);
return result;
}
reduceDimension([[0, 1], [2, 3]], 1); // [[0, 1], [2, 3]]
reduceDimension([[0, 1], [2, 3]], 2); // [0, 1, 2, 3]
reduceDimension([
[
[0, 1, 2],
[3, 4, 5],
],
[
[6, 7, 8],
[9, 10, 11],
],
], 3); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
underscore 中有,如果有兴趣的话可以看下我的源码解析 https://github.com/hanzichi/underscore-analysis/issues/10
const flatten = (list) => {
return list.reduce((pre, next) => Array.isArray(next) ? pre.concat(flatten(next)) : flatten(pre).concat(next), [])
}
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
是不是这种:flatten