配列のflatten

1538 ワード

微博で手作業で実現したという人を見た.flatten([1,[2,[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;
    }, []);
};