我们可以在 JavaScript 中为不可变对象添加属性吗?
Posted
技术标签:
【中文标题】我们可以在 JavaScript 中为不可变对象添加属性吗?【英文标题】:Can we add properties to immutable object in 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,它只是创建普通的数组和对象文字。你能发布一些创建一个真正的不可变对象的代码吗? 您的问题得到解答了吗?如果是,请标记正确答案。如果没有,请对给出的答案发表评论,并说明为什么这些答案没有回答您的问题。 【参考方案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
// ]
【讨论】:
以上是关于我们可以在 JavaScript 中为不可变对象添加属性吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Javascript 中为不和谐机器人制作随机生成器?