在 Javascript 中传播时替换对象中的键

Replace a key in an object while spreading in Javascript

我有以下对象,

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 
}

我想不出一步完成的方法(单个,当然,但不是一步)。解构休息后赋值做得很好:

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);

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

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

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

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“复制”到新对象。

您可以使用 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);