[数组,算法,面试]
待看文章
- JavaScript数组去重(12种方法,史上最全)
- 目前只看了首尾的ES6的两种方法
未分类
利用
apply
将二维数组转换为一维数组1
2
3
4
5const c = [[1, 2, 3], [4, 5, 6]]
// apply 会将传入的数组转换为参数传入
const newArray = [].concat.apply([], c)
console.log(newArray) // [1, 2, 3, 4, 5, 6]将树状的数组转换为一维数组
1
2
3
4
5
6
7
8
9
10
11export function flatten(array) {
return [].concat(...array.map(item => [].concat(item, ...flatten(item.subitems))))
}
// 将上面的代码结构化
function flatten(array) {
const newArray = array.map( item => {
return [].concat(item, ...flatten(item.subitems))
})
return [].concat(...newArray)
}filter()
结合indexOf()
:从一个数组中过滤另一个数组1
2
3
4// 原理:indexOf() 方法可返回数组中某个指定的元素位置。如果在数组中没找到指定元素则返回 -1。
// 过滤Array1中与Array2相等的部分
NewArray = Array1.filter(item => Array2.indexOf(item) < 0)
具体方法运用
Array.prototype.reduce()
相关文章:
数组去重
ES6
ES6的两种方法如果不考虑兼容性,是目前最简洁最使用的数组去重的方法
Set + Array.from()
Array.from(new Set(arr))
例子:
1 | function unique (arr) { |
…[扩展符] + Set
[...new Set(arr)]
例子:
1 | // ...拓展运算符,是遍历Symbol.iterator |
总结
两个方法中的 Array.from()
和 []
都是为了将类数组去重后转换为数组
ES5
es5的 filter()
1 | [1, 3, 4, 5, 1, 2, 3, 3, 4, 8, 90, 3, 0, 5, 4, 0].filter(function (elem, index, Array) { |
原生JS
总结
综合
数组去重合并
1 | function combine(){ |
多层数组扁平化去重排序
1 | Array.from(new Set(arr.flat(Infinity))).sort((a,b) => a-b) |
解析:
解析
以上可以分步总结为以下步骤:
已知如下数组:var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组
1 | var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10] |
- 拍平数组:const flatArray = arr => arr.reduce((a,b) => a.concat(Array.isArray(b) ? flatArray(b): b), []);
- 去重+排序: […new Set(flatArray)].sort((a,b) => a-b);
相关知识点
参考: