Skip to content

lodash

uniqBy

作用:对象数组去重。

js
const array = [
  { id: 1, name: "John" },
  { id: 2, name: "Jane" },
  { id: 1, name: "tom" }
];
// lodash
const res = _.uniqBy(array, "id");
仿写
js
const res = uniqBy(array, "id");

function uniqBy(array, key) {
  const set = new Set();
  return array.filter(item => {
    const field = item[key];
    if (set.has(field)) {
      return false;
    } else {
      set.add(field);
      return true;
    }
  });
}

countBy

作用:统计字段值累计出现的次数。

js
const array = [
  { id: 1, name: "John" },
  { id: 2, name: "Jane" },
  { id: 1, name: "tom" },
  { id: 3, name: "Jane" }
];
// lodash
const res = _.countBy(array, "name");
仿写
js
const res = countBy(array, "name");

function countBy(collection, key) {
  return collection.reduce((acc, item) => {
    const val = item[key];
    acc[val] = (acc[val] || 0) + 1; // acc默认为{},字段首次出现时acc[val]为undefined,默认赋值为0
    return acc;
  }, {});
}

groupBy

作用:对数组按照指定字段进行分组。

js
const array = [
  { id: 1, name: "John" },
  { id: 2, name: "Jane" },
  { id: 1, name: "tom" },
  { id: 3, name: "Jane" }
];
// lodash
const res = _.groupBy(array, "name");
仿写
js
const res = groupBy(array, "name");

function groupBy(collection, key) {
  return collection.reduce((acc, item) => {
    const field = item[key];
    if (!acc[field]) {
      acc[field] = [];
    }
    acc[field].push(item);
    return acc;
  }, {});
}

maxBy & minBy

作用:对数组按照指定字段,获取最大值所在元素并返回。

js
const arr = [
  { id: 1, name: "John", age: 12 },
  { id: 2, name: "Jane", age: 30 },
  { id: 3, name: "tom", age: 10 },
  { id: 4, name: "lili", age: -19 }
]
// lodash
const max = _.maxBy(arr, "age") // { id: 2, name: "Jane", age: 30 }
const min = _.minBy(arr, "age") // { id: 4, name: "lili", age: -19 }
Details
js
const max = maxBy(arr, "age") // { id: 2, name: "Jane", age: 30 }
const min = minBy(arr, "age") // { id: 4, name: "lili", age: -19 }

function maxBy(array, key) {
  return array.reduce((acc, item) => {
    return item[key] > (acc[key] || -Infinity) ? item : acc // 特别注意首个元素比较时的初始值
  }, {})
}

function minBy(array, key) {
  return array.reduce((acc, item) => {
    return item[key] > (acc[key] || Infinity) ? acc : item
  }, {})
}
js
const max = maxBy(arr, f => f?.age) // { id: 2, name: "Jane", age: 30 }

function maxBy(array, iteratee) {
  return array.reduce((acc, item) => {
    return iteratee(item) > (iteratee(acc) || -Infinity) ? item : acc
  }, {})
}

:::

Released under the MIT License.