极客时间返利平台,你可以在上边通过山月的链接购买课程,并添加我的微信 (shanyue94) 领取返现。

# 如何实现一个 omit/omitBy 函数

更多描述

const object = {
  a: 3,
  b: 4,
  c: 5,
};

//=> { c: 5 }
_.omit(object, ["a", "b"]);

// omit by value
//=> { b:4, c: 5 }
omitBy(object, (value) => value === 3);

Issue

欢迎在 Gtihub Issue 中回答此问题: Issue 793 (opens new window)

# TypeScript

一种简单思路,顺序遍历 source 的每一项 key,与参数做对比,通过即储存到目标对象中

function omit<T extends Record<string, unknown>>(source: T, keys: (keyof T)[]) {
  return Object.keys(source).reduce((target: T, nowKey: keyof T) => {
    if (!keys.includes(nowKey)) target[nowKey] = source[nowKey];
    return target;
  }, {} as T);
}

function omitBy<T extends Record<string, unknown>>(
  source: T,
  filterFn: (v: unknown) => boolean
) {
  return Object.keys(source).reduce((target: T, nowKey: keyof T) => {
    if (!filterFn(source[nowKey])) target[nowKey] = source[nowKey];
    return target;
  }, {} as T);
}

# JavaScript

function omit(source, keys) {
  return Object.keys(source).reduce((target, nowKey) => {
    if (!keys.includes(nowKey)) target[nowKey] = source[nowKey];
    return target;
  }, {});
}

function omitBy(source, filiterFn) {
  return Object.keys(source).reduce((target, nowKey) => {
    if (!filiterFn(source[nowKey])) target[nowKey] = source[nowKey];
    return target;
  }, {});
}

@alexzhang1030 omit 的复杂度过高,性能较差。应遍历 keys,逐一删除。另外,ts 直接用 Omit 这个内置 type。

@alexzhang1030 omit 的复杂度过高,性能较差。应遍历 keys,逐一删除。另外,ts 直接用 Omit 这个内置 type。

有个问题,直接删除不就修改源数据了

首先 {...obj}

---原始邮件--- 发件人: @._> 发送时间: 2022 年 10 月 21 日(周五) 中午 12:11 收件人: _@.>; 抄送: @.**@.>; 主题: Re: [shfshanyue/Daily-Question] 【Q747】如何实现一个 omit/omitBy 函数 (Issue #793)

@alexzhang1030 omit 的复杂度过高,性能较差。应遍历 keys,逐一删除。另外,ts 直接用 Omit 这个内置 type。

有个问题,直接删除不就修改源数据了

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

首先 {...obj}

---原始邮件---

发件人: @.***>

发送时间: 2022 年 10 月 21 日(周五) 中午 12:11

收件人: @.***>;

抄送: @.**@.>;

主题: Re: [shfshanyue/Daily-Question] 【Q747】如何实现一个 omit/omitBy 函数 (Issue #793)

@alexzhang1030 omit 的复杂度过高,性能较差。应遍历 keys,逐一删除。另外,ts 直接用 Omit 这个内置 type。

有个问题,直接删除不就修改源数据了

Reply to this email directly, view it on GitHub, or unsubscribe.

You are receiving this because you authored the thread.Message ID: @.***>

懂了,还的是月哥,待会我加上

function omit<
  T extends Record<string, any>,
  K extends string,
  K2 extends keyof T
>(obj: T, keys: (K | K2)[]) {
  const result = { ...obj };

  keys.forEach((key) => {
    delete result[key];
  });

  return result as Omit<T, K>;
}

function omitBy<T extends Record<string, any>, K extends keyof T>(
  object: T,
  callback: (value: T[K], key: K) => boolean
) {
  const result = { ...object };

  Object.entries(result).forEach(([key, value]) => {
    const isDrop = callback(value, key as K);

    if (isDrop) delete result[key];
  });

  return result as Partial<T>;
}
Last Updated: 11/4/2022, 6:34:31 PM