数组去重
filter实现数组去重
- 利用 indexOf只返回数组中第一次出现的元素的下标
- filter只返回判断为true的元素
const arr = [1, 2, 11, 22, 11, 1, 11, 22, 1, 2];
const unique = arr => arr.filter((element, index, self) => {
// self.indexOf(element) 每次都从数组第一个元素开始往下查
return self.indexOf(element) === index;
});
console.log(unique(arr)); // [1, 2, 11, 22]
reducer实现数组去重
- sort排序不可少
const arrReducer = [1, 2, 11, 22, 11,21, 1, 112,221,11, 221,112,22, 1, 2];
const uniqueR = (arr) =>
arr.sort().reduce((cache, current) => {
if (cache.length === 0 || cache[cache.length - 1] !== current) {
cache.push(current);
}
return cache;
}, []);
console.log(unique(arrReducer));
set方法去重
const arrReducer = [1, 2, 11, 22, 11,21, 1, 112,221,11, 221,112,22, 1, 2];
const newArr = [...new Set(arrReducer)]
原生js去重
function Arr(arr){
var item ;
var newArr =[]
var newObj = []
for(var i =0;i<arr.length ;i++){
item = arr[i]
if ( !newObj[item]){
newObj[item] = item
newArr.push(item)
}
}
return newArr
}
数组对象去重
方法一:
function Object1(arr,key){
let map = new Map()
for (const item of arr) {
if(!map.has(item[key])){
map.set(item[key],item)
}
}
return [...map.values()]
}
方法二:
function Object2(arr,key){
var newobj = {},newarr = []
for(var i = 0;i<arr.length;i++){
var item = arr[i]
if(!newobj[item[key]]){
newobj[item[key]] = newarr.push(item)
}
}
return newarr
}
数组降维
二维数组
- 方法一:
let arr = [[1, 2, 3], [2, 3, 4], [2, 5, 7]]
var res2 = arr.reduce((total, item) => {
return total.concat(item)
}, [])
多维数组
方法一:flat(参数)
- 1、flat() 方法返回一个新数组不会对原数组产生影响
[1, 2, [3, 4]].flat()
// [1, 2, 3, 4]
- 2、flat(参数) :flat默认只会‘拉平’一层,参数为整数时表示想要拉平的层数
[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]]
[1, 2, [3, [4, 5]]].flat(2)
// [1, 2, 3, 4, 5]
- 3、不管嵌套多少层都要转成一维数组可以用infinity关键字作为参数
[1, [2, [3]]].flat(Infinity)
// [1, 2, 3]
let arr = [[1, 2, 3], [2, [4, 5, [3, 6]]], [2, [8, 9]]]
let res4 = arr.flat(Infinity)
console.log(res4);
- 4、如果数组有空位,flat()方法会跳过空位
[1, 2, , 4, 5].flat()
// [1, 2, 4, 5]
拓展:flatMap()
方法对原数组的每个成员执行一个函数,相当于执行Array.prototype.map(),然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组。
// 相当于 [[2, 4], [3, 6], [4, 8]].flat()
[2, 3, 4].flatMap((x) => [x, x * 2])
// [2, 4, 3, 6, 4, 8]
//注意:flatMap()只能展开一层数组
- 方法二:
let arr = [[1, 2, 3], [2, [4, 5, [3, 6]]], [2, [8, 9]]]
let res = function (arr) {
return arr.reduce((total, item) => {
return total.concat(
Array.isArray(item) ?
res(item) :
item
);
}, []);
}
console.log(res(arr));
- 方法三
let ary = [1, [2, [3, [4, 5]]], 6];
let str = JSON.stringify(ary);