数组降维求大神帮忙

这是一个数组降维的方法,怎么修改让它实现多维数组降为一维数组呢?

Array.prototype.reduceDimension=function(){
      var result=[];
        return Array.prototype.concat.apply(result,this);
    }
阅读 4.7k
7 个回答

是不是这种:flatten

var flatten = function(array) {
    return array.reduce(function(previous, i) {
        if (Object.prototype.toString.call(i) !== '[object Array]') {
            return (previous.push(i), previous);
        }
        return (Array.prototype.push.apply(previous, flatten(i)), previous);
    }, []);
};

module.exports = flatten;
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]

const flatten = (list) => {
  return list.reduce((pre, next) => Array.isArray(next) ?  pre.concat(flatten(next)) : flatten(pre).concat(next), [])
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏