题目1
数组打平并去重 [1,2,3,4,5,6,7,8]
const arr = [[1, 2, 3], [3, 2, 1], [4, 5, 6, 7, 8, 8], [[2, 3, 4, 5], [[[4, 5, 6, 1, 2, 4]]]]];
解:
const list = Array.from(new Set(arr.flat(Infinity)));
console.log(list); // [1,2,3,4,5,6,7,8]
flat() 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。
使用 Infinity,可展开任意深度的嵌套数组
利用Set去重
知识点
题目2
const arr2 = [{ a: 'aaa', b: 'bbb' }, { a: 'aaa', b: 'bbb' }, [[{ a: 'aaa' }, { a: 'aaa', b: 'bbb' }], { a: 'aaa', b: 'bbb' }, { a: 'aaa', b: 'bbb', c: 'cccc' }]];
解:
const list2 = Array.from(new Set(arr2.flat(Infinity)));
// 显然set不成处理复杂数据
/**
* [
{ a: 'aaa', b: 'bbb' },
{ a: 'aaa', b: 'bbb' },
{ a: 'aaa' },
{ a: 'aaa', b: 'bbb' },
{ a: 'aaa', b: 'bbb' },
{ a: 'aaa', b: 'bbb', c: 'cccc' }
]
*/
console.log(list2);
const arr2Stri = arr2.flat(Infinity).map(el => JSON.stringify(el));
// 处理成字符串数组然后再利用Set去重
console.log(arr2Stri);
const list2Arr = Array.from(new Set(arr2Stri)).map(el => JSON.parse(el));
console.log(list2Arr);
显然如果是更复杂的对象 JSON.stringfy 就不能使用了。