复杂数组的展开

var a = [1,2,[{a:2},3,4,[5,6,{b:2}]]];
将这样一个数组展开成为一个一维的数组,要求是不能创建新的数组,在原数组本身修改

for (var i=0;i<a.length;i++){
    if(Array.isArray(a[i])){
        a.splice(i,1)[0].map(function (item,index) {
            a.splice(i+index,0,item);
        })
    }
}

写了一个实现,但是我记得之前并不是这么解决的,但是想不起来了,求一个更好的方案

阅读 4.9k
6 个回答
function flat(arr) {
    return arr.reduce(
        function(acc, val) {
            return acc.concat(Array.isArray(val)? flat(val): val)
        }, []);
}

function oneDimen(arr){

        var str = JSON.stringify(arr);
        str = str.replace(/[\[\]]/g, '');
        arr = eval('['+str+']');
        return arr;                
    }
a = [].concat.apply([],a)

面试题么?
提供一个思路:

a = JSON.stringify(a).replace(/\[|\{|\}|\]|\"/g, '').replace(/:/g, ',').split(',')
var flatGenerator = function*(arr) {

    for(var elem of arr) {
        if(elem instanceof Array) 
            yield* flatGenerator(elem);
        else
            yield elem;
    }
};

// 非原地
var flat = arr => Array.from(flatGenerator(arr));

// 原地
var flatten = arr => arr.splice(0, arr.length, ...flat(arr))

deep = arr => [].concat(...arr.map(v => Array.isArray(v) ? deep(v) : v));

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题