ES6基础-你应该知道的数组操作

121 阅读1分钟

1. 判断数组为空

const isEmpty = (arr) => Array.isArray(arr) && !arr.length

2. 克隆数组

const clone = (arr) => arr.slice(0);\
const clone = (arr) => [...arr];\
const clone = (arr) => Array.from(arr);\
const clone = (arr) => arr.map((it) => it);\
const clone = (arr) => arr.concat([]);

3. 数组是否相同

const isEqual = (a,b) => JSON.stringify([...new Set(a)].sort()) === JSON.stringify([...new Set(b)].sort())

const isEqual = (a,b) => a.length === b.length && a.every((v,i) => v === b[i]);

4. 数组转对象

const toObject = (arr,key) => arr.reduce((a,b) => ({...a, [b[key]] : b}), {});

const toObject = (arr,key) => Object.fromEntries(arr.map(it)=> [it[key], it]);

toObject(
    [
        { id: '1', name: 'Alpha', gender: 'Male' },
        { id: '2', name: 'Bravo', gender: 'Male' },
        { id: '3', name: 'Charlie', gender: 'Female' },
    ],
    'id'
);
/* 
{
    '1': { id: '1', name: 'Alpha', gender: 'Male' },
    '2': { id: '2', name: 'Bravo', gender: 'Male' },
    '3': { id: '3', name: 'Charlie', gender: 'Female' },
}
*/

5. 数据统计

const countBy = (arr,prop) => arr.reduce((all,cur) => ((all[cur[prop]] = ++ all[cur[prop]] || 1), prev), {});

countBy(
    [
        { branch: 'audi', model: 'q8', year: '2019' },
        { branch: 'audi', model: 'rs7', year: '2020' },
        { branch: 'ford', model: 'mustang', year: '2019' },
        { branch: 'ford', model: 'explorer', year: '2020' },
        { branch: 'bmw', model: 'x7', year: '2020' },
    ],
    'branch'
);

// { 'audi': 2, 'ford': 2, 'bmw': 1 }

6. 数组求和

const accumulate = (arr) => arr.reduce((a, b, i) => (i === 0 ? [b] : [...a, b + a[i - 1]]), [0]);

7. 数组分隔

const chunk = (arr, size) => arr.reduce((acc, e , i) => (i % size ? acc[acc.length - 1].push(e) : acc.push([e]), acc), []);

8. 数组去重复

const removeDuplicate = (arr) => arr.filter((i) => arr.indexOf(i) === arr.lastIndexOf(i));
const union = (...arr) => [...new Set(arr.flat())];

9. 数组合并

const merge = (a, b) => [...a, ...b];
const merge = (a, b) => [...new Set([...a, ...b])];

10. 数组两个之间插入一个默认值

const intersperse = (a, s) => [...Array(2 * a.length - 1)].map((_, i) => (i % 2 ? s : a[i / 2]));

11. 数组扁平化

const flat = (arr) =>
    [].concat.apply(
        [],
        arr.map((a) => (Array.isArray(a) ? flat(a) : a))
    );

12. 数组交换值

const swapItems = (a, i ,j) => (a[i] && a[j]
&& [...a.slice(0,i), a[j], ...a.slice(i + 1, j), a[i],
...a.slice(j + 1)]) || a;

swapItems([1, 2, 3, 4, 5], 1, 4); // [1, 5, 3, 4, 2]