【问题标题】:Replace a key in an object while spreading in Javascript在 Javascript 中传播时替换对象中的键
【发布时间】:2021-02-17 13:22:51
【问题描述】:

我有下面的对象,

const obj = {
  'a': 1,
  'b': 2,
  'c': 3,
  'd': 4,
  .
  .
  .
  .
  'z': 26
}

我想要一个新对象,它将包含所有键作为对象obj,但不是一个特定键,而是我希望用另一个键替换它,比如我想省略键 'a' 并替换它与'new_a'。以下方式不会删除原始密钥'a'。有没有办法通过别名来实现它?还是删除键 'a' 是唯一的选择?

const obj2 = {
   ...obj,
   'new_a': 111
}

我希望obj2是这样的-

{
   'new_a': 111,
   'b': 2,
   'c': 3,
   .
   .
   .
   .
   'z': 26 
}

【问题讨论】:

  • 如果他们的密钥不需要是new_a,你可以像const obj2 = { ...obj, 'a': 111 }一样简单地覆盖它

标签: javascript object spread


【解决方案1】:

我想不出一步完成的方法(当然,单,但不是单步)。不过,在休息后进行解构可以很好地做到这一点:

const {a, ...obj2} = obj;
obj2.new_a = obj.a; // Or just `= a;`, either way

现场示例:

const obj = {
    'a': 1,
    'b': 2,
    'c': 3,
    'd': 4,
    // ...
    'z': 26
};
const {a, ...obj2} = obj;
obj2.new_a = obj.a;
console.log(obj2);

【讨论】:

  • 这是一个单线器const obj2 = (({a: newA, ...rest}) => ({newA, ...rest}))(obj)
【解决方案2】:

如果您不希望 new_a 具有与 a 相同的值,则:

const obj2 = { ...obj, new_a: 111 };
delete obj2["a"];

【讨论】:

    【解决方案3】:

    也许不是最干净的方法,而是单线:

    const obj = {
      'a': 1,
      'b': 2,
      'c': 3,
      'd': 4,
      'z': 26
    }
    
    let obj2 = { 
        'new_a': 111, 
        ...Object.fromEntries(Object.entries(obj).filter(([key]) => key !== 'a'))
    };
    
    console.log(obj2);

    这样您就不必delete 任何键,也不必将原始a“复制”到新对象。

    【讨论】:

      【解决方案4】:

      您可以使用 iife 和对象剩余扩展运算符来收集除重命名的属性之外的所有属性并扩展以将它们添加到新对象。 mdn docs 供参考。

      const obj2 = (({a: newA, ...rest}) => ({newA, ...rest}))(obj)


      为了便于阅读,您可能需要考虑编写适配器函数,它很好,并且很好地描述了对象属性的转换。

      const obj = {a: 1, b: 2, c:3, d: 4};
      
      const adapter = ({a: newA, ...rest}) => ({newA, ...rest});
      
      const obj2 = {
        ...adapter(obj), 
      }
      
      console.log(obj2);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-20
        • 2018-06-05
        • 2015-03-31
        • 2020-09-17
        • 1970-01-01
        • 1970-01-01
        • 2018-01-09
        • 1970-01-01
        相关资源
        最近更新 更多