我对 map() 的行为感到很困惑。
我有一组这样的对象:
const products = [{
...,
'productType' = 'premium',
...
}, ...]
我将这个数组传递给一个函数,该函数应该返回相同的数组但所有产品都是免费的:
[{
...,
'productType' = 'free',
...
}, ...]
功能是:
const freeProduct = function(products){
return products.map(x => x.productType = "free")
}
它返回以下数组:
["free", "free", ...]
所以我重写了我的函数:
const freeProduct = function(products){
return products.map(x => {x.productType = "free"; return x})
}
它按预期返回数组。
但 !这就是我失去理智的时刻,在这两种情况下,我的原始产品数组都被修改了。
map() 周围的文档说它不应该( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map )。
我什至尝试创建一个数组的克隆,将我的函数变成这样:
const freeProduct = function(products){
p = products.splice()
return p.map(x => {x.productType = "free"; return x})
}
但我仍然得到相同的结果(这开始让我发疯)。
我将非常感谢任何可以向我解释我做错了什么的人!
谢谢你。
原文由 Edwin Joassart 发布,翻译遵循 CC BY-SA 4.0 许可协议
您没有修改原始数组。您正在修改数组中的对象。如果您想避免改变数组中的对象,您可以使用
Object.assign
创建一个具有原始属性的新对象以及您需要的任何更改:2018年编辑:
在 大多数浏览器 中,您现在可以使用对象扩展语法而不是
Object.assign
来完成此操作: