自定义实现groupBy和countBy函数

70 阅读1分钟

groupBy 函数

// 字符串
const customGroupBy = (data, key) => {
  return data.reduce((acc, cur) => {
    const name = cur[key];
    if (!acc[name]) {
      acc[name] = [];
    }
    acc[name].push(cur);
    return acc;
  }, {});
}
// 函数
const customGroupBy = (data, generateKey) => {
  return data.reduce((acc, cur) => {
    const name = generateKey(cur);
    if (!acc[name]) {
      acc[name] = [];
    }
    acc[name].push(cur);
    return acc;
  }, {});
}
// 参数归一化(推荐)
const customGroupBy = (data, generateKey) => {
  return data.reduce((acc, cur) => {
    const groupKey = typeof generateKey === 'function' ? generateKey(cur) : cur[generateKey];
    if (!acc[groupKey]) {
      acc[groupKey] = [];
    }
    acc[groupKey].push(cur);
    return acc;
  }, {});
};
// 示例
const data = [
  { id: 1, name: 'John', age: 25 },
  { id: 2, name: 'Jane', age: 30 },
  { id: 3, name: 'John', age: 27 },
  { id: 4, name: 'Jane', age: 24 },
  { id: 5, name: 'Jane', age: 24 }
];
/ const groupedData = customGroupBy(data, 'name')
// console.log(groupedData)

const groupedData = customGroupBy(data, (item) => item.name + item.age);
console.log(groupedData)

countBy函数

const customCountBy = (data, generateKey) => {
 return data.reduce((acc, cur) => {
   const groupKey = typeof generateKey === 'function'
     ? generateKey(cur)
     : typeof cur === 'string'
       ? cur
       : cur[generateKey];
   const count = acc[groupKey] ?? 0
   return {
     ...acc,
     [groupKey]: count + 1
   }
 }, {});
}
// 示例
const data = [
  { id: 1, name: 'John', age: 25 },
  { id: 2, name: 'Jane', age: 30 },
  { id: 3, name: 'John', age: 27 },
  { id: 4, name: 'Jane', age: 24 },
  { id: 5, name: 'Jane', age: 24 }
];
const countedData = customCountBy(data, 'name')
// const countedData = customCountBy(data, (item) => item.name);
console.log(countedData)