Flatten an array - loop vs reduce (v3)

Revision 3 of this benchmark created on


Setup

// input = [[0, 1], [2, 3], [4, 5]];
    
     input = ['axyz',2, ['b','c'],['d',['e','f',['g',[3,'m']  ]],'h']  ]

Test runner

Ready to run.

Testing in
TestOps/sec
loop
var flattened=[];
for (var i=0; i<input.length; ++i) {
    var current = input[i];
    for (var j=0; j<current.length; ++j)
        flattened.push(current[j]);
}
ready
reduce
var flattened = input.reduce(function(a, b) {
    return a.concat(b);
}, []);
ready
concat.apply
var flattened = Array.prototype.concat.apply([],input);
ready
forEach+push
var flattened=[];
input.forEach(function(entry) {
    flattened.push.apply(entry);
});
ready
recursive
        (function flattenArr(input) {
           var flattened = [];
           for (var i = 0; i < input.length; i++) {
               var current = input[i];
               var isArray = ({}).toString.call(current) == '[object Array]';
               if(isArray) {
                   current = flattenArr(current);
                   switch(current.length){
                       case 1: [].push.call(flattened,current[0]);
                       case 2: [].push.call(flattened,current[0],current[1]);
                       case 3: [].push.call(flattened,current[0],current[1],current[2]);
                       default: [].push[isArray?'apply':'call'](flattened,current);
                   }
               }else{
                    [].push.call(flattened,current)
               }
            }
            return flattened;
       })(input)
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.