【问题标题】:Object spread not giving desired results对象传播没有给出预期的结果
【发布时间】:2018-03-11 07:37:36
【问题描述】:

let me={
    name:"Shivendra",
    age:21
}


let you={
    name:"Neha",
    age:22
}


let mergeMeAndYou={
    ...me, ...you
}

console.log(mergeMeAndYou);

我得到了输出:- { name: 'Neha', age: 22 }

现在我没想到会这样。任何人都可以解释这个结果吗? & 我现在将如何获得合并的对象?我使用的是节点版本 8.9.4。

【问题讨论】:

  • 当你传播对象“我”时,它有键 {name,age},当你传播对象“你”时,它也有相同的键 {name,age}。所以它替换以前的赋值并用新的替换。结果 {"name": "Neha", "age": 22}
  • 你期望什么输出?
  • 这是预期的结果,因为传播会合并相同的键,所以在你的情况下,它会得到“你”对象的值
  • 你是 100% 正确的@BooBerr'ita ,那是你的对象传播不起作用......愚弄我......
  • 是的@Atiq 你是对的

标签: javascript ecmascript-next


【解决方案1】:

您可以通过使用{} 将对象括起来来做到这一点,例如:{...obj}

let me={
   name:"Shivendra",
   age:21
}


let you={
   name:"Neha",
   age:22
}

//Putting the me and you on an array.
let mergeMeAndYou = [
   {...me},{ ...you}
]

console.log(mergeMeAndYou);

//Putting the me and you on an object.	
let mergeMeAndYou2 = {
   me:{...me}, you:{ ...you}
}

console.log(mergeMeAndYou2);

注意:根据您想要组合对象的方式,您实际上并不需要展开对象。你可以:

let mergeMeAndYou = [me,you];

let mergeMeAndYou2 = {me:me, you:you}

【讨论】:

  • 谢谢我理解了soln,你说得对,这个对象传播确实不需要
  • 是的,如果您只是分配(通过引用),则不需要。如果您试图克隆对象,那么您需要传播它。在ECMAScript 2018 中,这是克隆对象的一种方法。
  • 乐于帮助@ShivendraGupta
【解决方案2】:

我认为您误解了对象传播的作用。它将每个对象的属性列出到一个新对象中。如果您对多个对象执行此操作,它会将对象的属性合并到一个新对象中。如果多个展开对象中存在相同的属性,则后一个对象中的那个获胜。您是否期望它将对象附加到新的父结构中?或者您希望看到什么?

如果您希望将对象放置到父对象中,请尝试以下操作:

const us = { me, you }

或父数组:

const we = [ me, you ]

【讨论】:

  • 我试过你的建议,但我得到了错误,意外毒物{
  • 如果您已经定义了对象变量meyou 如您的代码所示,以及Node 8.9.4,那么放在您之后的代码应该可以正常工作。
【解决方案3】:

查看结果。 mergeMeAndYou 函数用“you”替换“me”对象,mergeYouAndMe 函数用我替换“you”对象

let me={
    name:"Shivendra",
    age:21
}


let you={
    name:"Neha",
    age:22
}


let mergeMeAndYou={
    ...me, ...you
}

let mergeYouAndMe={
    ...you, ...me
}

console.log(mergeMeAndYou);

console.log(mergeYouAndMe);

【讨论】:

  • 是的,没错,但不是我想要的,我实际上是想合并对象。
  • 你能提供你想到的愿望结果吗?这将有助于我们了解您的实际需求。
【解决方案4】:

对象字面量中的扩展语法将对象属性复制到一个新对象上。

来自 MDN docs

ECMAScript 提案的 Rest/Spread 属性(第 4 阶段)将扩展属性添加到对象字面量。它将自己的可枚举属性从提供的对象复制到新对象。

提供的示例如下:

var obj1 = { foo: 'bar', x: 42 };
var obj2 = { foo: 'baz', y: 13 };

var clonedObj = { ...obj1 };
// Object { foo: "bar", x: 42 }

var mergedObj = { ...obj1, ...obj2 };
// Object { foo: "baz", x: 42, y: 13 }

【讨论】:

    猜你喜欢
    • 2020-05-29
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 2021-01-06
    • 2018-12-08
    相关资源
    最近更新 更多