【问题标题】:Alternative to lodash omit替代 lodash 省略
【发布时间】:2020-04-14 06:37:04
【问题描述】:

我想删除一个属性并返回一个新对象而不改变原始对象。

我知道我们可以像这样使用 Lodash 轻松做到这一点:

const profile = { name: 'Maria', age: 30 }
_.omit(profile, name) // it returns a new object without the property name {age: 30}

但是,我想知道是否可以在不将该值分配给 undefined 或使用 filter 的情况下使用 vanilla JavaScript 来做到这一点?

【问题讨论】:

标签: javascript object lodash


【解决方案1】:

仅使用其余参数的已接受答案略有不同:

const omit = (o, ...paths) => 
 Object.fromEntries(Object.entries(o).filter(([k]) => !paths.includes(k)))

【讨论】:

    【解决方案2】:

    你可以试试这个。

    export const flattenKeys = (s) =>
      s
        .replace(/\[(\w+)\]/g, '.$1')
        .replace(/^\./, '')
        .split('.');
    
    export const omit = (object, path) => {
      const obj = object;
    
      let keys = path;
    
      if (typeof keys === 'string') {
        keys = flattenKeys(keys);
      }
    
      if (keys.length === 1) {
        delete obj[keys];
    
        return undefined;
      }
    
      return omit(obj[keys[0]], keys.slice(1).join('.'));
    };
    

    例子:

    const data = {
      user: {
        name: 'Khoa',
        age: 24
      },
      company: {
        name: 'Test',
      }
    }
    
    omit(data, 'company.name')
    
    // output:
    // { user: { name: 'Khoa', age: 24 }, company: {} }
    

    【讨论】:

      【解决方案3】:
       const obj = { 
         prop0: 0, 
         prop1: 1, 
         prop2: 2, 
         prop3: 3, 
       };
         
       const prunedObj = (({ prop1, prop2, ...rest }) => rest)(obj);
      
       // prunedObj => { prop0: 0, prop3: 3}
      

      【讨论】:

        【解决方案4】:

        写了一个包来解决这个问题

        https://www.npmjs.com/package/fp-omit

        它不会变异或在底层使用 delete,而是纯函数式 rambda 函数

        【讨论】:

          【解决方案5】:

          对于单个键,您可以destructure the object,并使用computed propertyrest 来创建没有属性的对象:

          const omitSingle = (key, { [key]: _, ...obj }) => obj
          const profile = { name: 'Maria', age: 30 }
          
          const result = omitSingle('name', profile)
          
          console.log(result)

          要省略多个属性,可以将对象转换为 [key, value] 对,根据列出的键数组过滤对,然后通过Object.fromEntries() 转换回对象:

          const omit = (keys, obj) => 
            Object.fromEntries(
              Object.entries(obj)
                .filter(([k]) => !keys.includes(k))
            )
            
          const profile = { name: 'Maria', gender: 'Female', age: 30 }
          
          const result = omit(['name', 'gender'], profile)
          
          console.log(result)

          【讨论】:

          • 非常感谢您的第一个选项正是我想要的,它是_.omit 的完美替代品,尽管这种语法对我来说是全新的。
          • 不客气。我添加了一些可能会为您提供更多信息的链接。
          【解决方案6】:

          如果没有嵌套对象,尝试如下克隆:

          const profile = { name: 'Maria', age: 30 }
          
          function deleteProperty(object, property){
            var clonedObject = JSON.parse(JSON.stringify(object));
            delete clonedObject[property];
            return clonedObject;
          }
          
          var newProfile = deleteProperty(profile, "name");
          
          console.log(profile);
          console.log(newProfile);

          【讨论】:

          • 非常感谢这是一个简单直接的解决方案,我真的很喜欢它
          • 使用 JSON.parse 比像这样的扩展运算符有什么优势: const clonedObject = {...object} ?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-24
          • 2018-06-08
          • 1970-01-01
          相关资源
          最近更新 更多