【问题标题】:Can we add properties to immutable object in JavaScript?我们可以在 JavaScript 中为不可变对象添加属性吗?
【发布时间】:2019-02-20 00:54:31
【问题描述】:

一个对象是这样的:

const obj = [{name: 'Alex', age: 20}, {name: 'James', age: 22}];

这个对象在 Immutable.js 中是不可变的。

是否可以为每个对象添加一个新键?示例:

const obj = [{name: 'Alex', age: 20, city: 'New York'}, {name: 'James', age: 20, city: 'Rome'}];

【问题讨论】:

  • 如果您只是尝试向每个对象添加属性会发生什么?
  • "This obect is immutable from Immutable.js" - 您发布的 sn-p 不使用 immutable.js,它只是创建普通的数组和对象文字。你能发布一些创建一个真正的不可变对象的代码吗?
  • 您的问题得到解答了吗?如果是,请标记正确答案。如果没有,请对给出的答案发表评论,并说明为什么这些答案没有回答您的问题。

标签: javascript reactjs ecmascript-6 immutable.js ecmascript-2017


【解决方案1】:

如果它是不可变的,则不是。但这没关系,您可以将所有属性复制到一个新结构中,然后以这种方式添加您需要的任何内容:

const newData = obj.map(person => ({
  ...person,
  city: someLogicToDetermineCity(person)
}))

function someLogicToDetermineCity(person) {
  // logic based on person
  return city
}

【讨论】:

    【解决方案2】:

    const 不会创建不变性 - 它只是意味着在创建时分配给它的 reference 以后不能更改(这只是意味着您不能为其分配新值)。

    查看这些示例:

    const a = {}
    
    a = { name: "peter" } // => TypeError: invalid assignment to const `a'

    但是在a上分配属性是没有问题的:

    const a = {}
    
    a.name = "peter"
    
    console.log(a); // => { "name": "peter" }

    这同样适用于Array 对象:

    const arr = [{}]
    
    arr.push(1);
    
    arr[0].name="peter"
    
    console.log(arr);
    // [
    //  {
    //    "name": "peter"
    //  },
    //  1
    // ]

    【讨论】: