数组的flatten

微博上看到有人说手工实现个_.flatten(将[1,[2,[2,1]],2]变为[1,2,2,1,2])就可以给他发简历了,发简历没什么兴趣,倒是可以试着实现一个。想了想其实这个不难,我的实现如下:

var flatten = function(arr) {
    var index = arguments[1] || 0;
    var destArr = arr.slice(0, index).concat(arr[index]).concat(arr.slice(index + 1));
    return index === arr.length ? arr: arguments.callee(destArr, ++index);
}

原理就是对数组进行concat生成新的数组,concat的时候可以减少数组的维数。后面看了微博上其他人的实现,顿时觉得自己好2。直接concat就行了,下面是别人的实现:

Array.prototype.flatten = function() {
    var flattened = Array.prototype.concat.apply([], this);
    if (flattened.length == this.length) return flattened;
    else return flattened.flatten();
}

附上underscore的_.flatten

_.flatten = function(array, shallow) {
    // 迭代数组中的每一个元素, 并将返回值作为demo传递给下一次迭代
    return _.reduce(array, function(memo, value) {
        // 如果元素依然是一个数组, 进行以下判断:
        // - 如果不进行深层合并, 则使用Array.prototype.concat将当前数组和之前的数据进行连接
        // - 如果支持深层合并, 则迭代调用flatten方法, 直到底层元素不再是数组类型
        if(_.isArray(value))
            return memo.concat( shallow ? value : _.flatten(value));
        // 数据(value)已经处于底层, 不再是数组类型, 则将数据合并到memo中并返回
        memo[memo.length] = value;
        return memo;
    }, []);
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值