分享一个前端面试题:数组打平并去重

429 阅读1分钟

题目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 就不能使用了。