只有一行js的有用方法(数组篇)

161 阅读2分钟

判断两个数组是否相等

// a和b都是数组
const isEqual = (a, b) => JSON.stringify([...new Set(a)].sort()) === JSON.stringify([...new Set(b)].sort());
// 实现效果
isEqual([1, 2, 3], [1, 2, 3]); // true
isEqual([1, 2, 3], [1, 3, 2]); // true
isEqual([1, 2, 3], [1, '2', 3]); // false
  • 通过 Set对象 对数组进行去重
  • 然后利用 sort() 方法排序去重后的数组
  • 最后将该数组转成JSON字符串判断字符串是否相等

将值转换为数组

const castArray = (value) => (Array.isArray(value) ? value : [value]);
//实现效果
castArray(1); // [1]
castArray([1, 2, 3]); // [1, 2, 3]

判断数组是否为空

const isEmpty = (arr) => Array.isArray(arr) && !arr.length;
//实现效果
isEmpty([]); // true
isEmpty([1, 2, 3]); // false

复制一个数组

//arr 为数组
const clone = (arr) => arr.slice(0);
//or
const clone = (arr) => [...arr];
//or
const clone = (arr) => Array.from(arr);
//or
const clone = (arr) => arr.map((x) => x);
//or
const clone = (arr) => JSON.parse(JSON.stringify(arr));
//or
const clone = (arr) => arr.concat([]);
//or
const clone = (arr) => structuredClone(arr);

注:structuredClone()为web平台用于深拷贝的内置函数,目前主流浏览器的最新版均已实现了此 API,Firefox 94,Chrome 98 已支持。

将数组对象转换为单个对象

const toObject = (arr, key) => arr.reduce((a, b) => ({ ...a, [b[key]]: b }), {});
// or
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' },
}
*/

Object.fromEntries()  方法把键值对列表转换为一个对象

得出数组中某个属性的值出现次数对象

const countBy = (arr, prop) => arr.reduce((prev, curr) => ((prev[curr[prop]] = ++prev[curr[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 }

计算数组中值的出现次数

const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a), 0);
// or
const countOccurrences = (arr, val) => arr.filter((item) => item === val).length;
//实现效果
countOccurrences([2, 1, 3, 3, 2, 3], 2); // 2
countOccurrences(['a', 'b', 'a', 'c', 'a', 'b'], 'a'); // 3