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

问题描述

我有以下对象,

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

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

'a'

我希望obj2变成这样-

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

解决方法

我想不出一个方法来一步完成(当然,单,但不是一个步骤)。用休息和赋值进行解构虽然很好:

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_aa 具有相同的值,则:

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

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

const obj = {
  'a': 1,'z': 26
}

let obj2 = { 
    'new_a': 111,...Object.fromEntries(Object.entries(obj).filter(([key]) => key !== 'a'))
};

console.log(obj2);

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

,

您可以使用 iife 和对象 rest 扩展运算符来收集除重命名的属性之外的所有属性,然后扩展以将它们添加到新对象中。 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});

const obj2 = {
  ...adapter(obj),}

console.log(obj2);