console.log([].concat([1],[2],[3])); // [1, 2, 3]console.log([].concat([[1],[2],[3]])); // [[1], [2], [3]]console.log([].concat(4,[[5,6],[7]])); // [4, [5, 6], [7]]上面代码中,第一个返回值是将一个空数组与三个数组[1],[2],[3]合并为一个数组,因此返回了[1, 2, 3]。第二个是将一个空数组与一个二维数组合并,二维数组的成员为[1],[2],[3],因此返回了[[1], [2], [3]],注意,返回的是二维数组。第三个例子同理。这里对概念的理解很重要,即将新数组的成员,添加到原数组的尾部。
console.log([].concat(1,2,3)); //[1,2,3]; //等同于 console.log([].concat(1,[2,3])); //[1,2,3]; console.log([].concat([1],[2,3])); //[1,2,3];这里虽然内容较少,看起来挺简单。但是真正理解起来真的不容易。
看例子就能明白是什么意思了。
这道题目中,其中一个解决方案就是:
var flatten = function (arr){ return [].concat.apply([],arr);};这一段简单的函数就可以实现将数组中的元素合并的功能。但是当我在理解这个返回值的时候,出现了一个问题。
console.log([].concat.apply([],[[1],[2],[3]])); //[1, 2, 3]console.log([].concat([[1],[2],[3]])); //[[1], [2], [3]]上面代码中,同样是在一个空数组中向尾部添加新数组,第一个返回的是[1,2,3]。第二个却是一个二维数组。
console.log([].concat(1,2,3)); //[1, 2, 3]console.log([].concat([1],[2],[3])); //[1, 2, 3]console.log([].concat([[1],[2],[3]])); //[[1], [2], [3]]console.log([].concat([[[1],[2],[3]]])); // [[[1], [2], [3]]]上面代码中,从单个元素,到一维数组,二维数组,三维数组逐渐变化的。
console.log([].concat([1],[2],[3])); //[1, 2, 3]console.log([].concat([[1],[2],[3]])); //[[1], [2], [3]]console.log([].concat.apply([],[[1],[2],[3]])); //[1, 2, 3]在上面代码中,上半段直接使用concat方法,将传入的参数合并到空数组中。下半段中,调用了String对象的实例方法apply,将concat()函数内部的this指向了[],并且在[]作用域下,传入调用concat需要的参数,并且以数组的方式传入。再看几个例子。
console.log([].concat([1,2,3])); //[1, 2, 3]console.log([].concat.apply([],[[1],[2],[3]]));//[1, 2, 3]console.log([].concat([[1],[2],[3]]));//[[1], [2], [3]]console.log([].concat.apply([],[[[1],[2],[3]]]));//[[1], [2], [3]]console.log([].concat([[[1],[2],[3]]]));//[[[[1], [2], [3]]]]console.log([].concat.apply([],[[[[1],[2],[3]]]]));//[[[1], [2], [3]]]总结:
var flatten = function (arr){ return [].concat.apply([],arr);};
var flatten = function (array){ return array.reduce(function(a,b){ return a.concat(b); },[])}如果对不理解apply方法,可以前往这篇文章:Javascript中call,apply,bind方法的详解与总结