扁平化
数组扁平化,就是将一个嵌套多层的数组array(嵌套可以是任何层数)转化为只有一层的数组。
1 | var arr = [1,[2,3,4,[5,6,7],8],9]; |
递归
循环数组元素,如果还是一个数组,就递归调用该方法:
1 | var arr = [1,[2,[3,4]]]; |
toString
如果数组的元素都是数字,那么我们可以考虑使用toString方法,因为:
1 | [1, [2, [3, 4]]].toString() // "1,2,3,4" |
使用了同String方法会返回个元素的字符串形式,默认是一逗号分隔
1 | var arr = [1, [2, [3, 4]]]; |
使用场景只限于纯数字的情况下。
redcue
既然是对数组进行处理,且最终返回一个值,可以考虑使用reduce来简化代码:
1 | var arr = [1, [2, [3, 4]]]; |
ES6增加了扩展运算符,用于取出参数对象的所有可遍历属性,拷贝到当前对象之中:
1 | var arr = [1, [2, [3, 4]]]; |
似乎不是我们要的效果,但是思路还是一样的
1 | var arr = [1, [2, [3, 4]]]; |
underscore
这里是underscore的_.flatten的源码
1 | /** |
strict和shallow各种值对应的结果:
shallow: true
+stric: faslse
:正常扁平一层shallow: false
+stric: false
: 正常扁平所有层shallow: true
+stric: true
: 去掉非数组元素shallow: false
+stric: true
: 返回一个[]
让我们看看在underscore中那些方法调用了flatten这个函数:_.flatten
1
2
3
4
5
_.flatten = function(array, shallow) {
// 正常的扁平中,并不需要去掉非数组元素
return flatten(array, shallow, false);
}
_.union
接下来是_.union
这个函数传入多个数组,然后返回传入的数组的并集
1 | _.union([1, 2, 3], [1 ,2 ,3 ,4 , 5, 6], [4 ,5 ,6 ,7, 8, 9]); |
如果传入的参数不是数组,就会跳过该参数:
1 | _.union([1, 2, 3], {value: 4}, [3, 4, 5], ,6 7); |
为了实现这个效果,我们可以将传入的所有数组扁平化,然后去重,因为只能传入数组,这个时候我们可以让strict 为 true,就可以跳过传入的非数组的元素。
1 | function unique(array) { |
_.difference
通过strict的灵活运用,我们了解了_.flatten 和 _.union,接下来在看一个 _.difference
语法:
.difference(array, *others)
效果是取出来自array数组,并且不存在于多个other数组的元素。和.union一样,都会排除掉不是数组的元素。
1 | _.difference([1, 2, 3, 4, 5], [5, 2, 10], [4], 1); |
实现方法
1 | function difference(array, ...rest) { |
大神的写法
1 | flatten = Function.apply.bind([].concat, []) |
这里解释
1 | Function.apply.bind([].concat, []) |