【问题标题】:"Removing" multiple properties from an object without mutation从一个对象中“删除”多个属性而不发生突变
【发布时间】:2020-08-29 09:37:41
【问题描述】:

我正在寻找一种创建函数的方法。我可以在其中传递一个对象和一组我想要的属性(键)。该函数将返回一个没有我指定的键的新对象。

function(keys: array, obj: object) {...}

问题是 - 我该如何处理多个属性?

我搜索了,只找到了这种解决方案:

const myObject = {
  a: 1,
  b: 2,
  c: 3
};

const { a, ...noA } = myObject;

但只有当我只想删除一个键时它才有效。如果我想删除多个,使用我刚刚传递的数组怎么办?如何在不改变原始数组或手动创建副本的情况下做到这一点?

【问题讨论】:

  • const {a, b, ...noAorB } = myObject?

标签: javascript arrays object ecmascript-6 ecmascript-2016


【解决方案1】:

您可以使用reduceObject.entries() 来实现。你可以试试这个:

const myObject = {
  a: 1,
  b: 2,
  c: 3,
  d: 4
};

const removeProps = (object, keys) => {
    return Object.entries(object).reduce((a, [key, value]) => (keys.indexOf(key) === -1 ? {...a, [key]: value}: a), {});
}

console.log(removeProps(myObject, ['b']));
console.log(removeProps(myObject, ['b', 'c']));
console.log('Original Object: ', myObject);
.as-console-wrapper{min-height: 100%!important; top: 0}

【讨论】:

    【解决方案2】:

    您可以通过为不需要的属性获取计算属性来解构对象。

    const
        without = (object, keys) => keys.reduce((o, k) => {
            const { [k]: _ , ...p } = o;
            return p;
        }, object),
        myObject = { a: 1, b: 2, c: 3 },
        keys = ['a', 'b'],
        result = without(myObject, keys);
    
    console.log(result);

    【讨论】:

    • 可爱但像往常一样不可读;)只是一点点文档,或者可能只是多个字符的描述性变量名称?我假设_ 是在[k]: _ 中删除内容的那个
    • 刚刚我自己测试了它,它就像一个魅力!我只会增加一点可读性,问题就解决了。谢谢!我会确保刷新我对 reduce 工作原理的记忆
    • @mplungjan, _ 只是一个需要的临时名称,它应该不在对象中。
    • @mplungjan 我认为它的可读性很好,[k] 是从对象中提取的属性,它被重命名为 _ 在使用带括号的属性访问器时如果不重命名它就无法工作符号
    【解决方案3】:

    以上答案很好,我正在分享我的尝试:

    var myObject = { a: 1, b: 2, c: 3, d: 4};
    let remove=(obj, arr)=> {
      let output=[];
      for(const [key, value] of Object.entries(obj)){
      if(!arr.includes(key)){
         output.push([key,value]);
        }
      }
     return Object.fromEntries(output);
    }
    console.log(remove(myObject, ['a']));
    console.log(remove(myObject, ['a', 'c']));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-11
      • 2021-01-16
      • 2018-02-03
      • 2016-02-14
      • 2011-04-03
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      相关资源
      最近更新 更多