克隆JavaScript对象的最有效方法是什么?我已经看到obj = eval(uneval(o));被使用,但这是非标准的,只有Firefox支持.
我做过类似的事情,obj = JSON.parse(JSON.stringify(o));但质疑效率.
我也看到了具有各种缺陷的递归复制功能.
我很惊讶没有规范的解决方案.
我对map()的行为很困惑.
我有一个这样的对象数组:
const products = [{
...,
'productType' = 'premium',
...
}, ...]
Run Code Online (Sandbox Code Playgroud)
我将这个数组传递给一个函数,该函数应返回相同的数组,但所有产品都是免费的:
[{
...,
'productType' = 'free',
...
}, ...]
Run Code Online (Sandbox Code Playgroud)
功能是:
const freeProduct = function(products){
return products.map(x => x.productType = "free")
}
Run Code Online (Sandbox Code Playgroud)
返回以下数组:
["free", "free", ...]
Run Code Online (Sandbox Code Playgroud)
所以我重写了我的功能:
const freeProduct = function(products){
return products.map(x => {x.productType = "free"; return x})
}
Run Code Online (Sandbox Code Playgroud)
它按预期返回数组.
但是!那是我放松心情的时刻,在这两种情况下我的原始产品阵列都被修改了.
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})
}
Run Code Online (Sandbox Code Playgroud)
但我仍然得到相同的结果(这开始让我发疯).
我会非常感谢任何可以解释我做错的人!
谢谢
javascript ×2
clone ×1
copy ×1
deep-copy ×1
dictionary ×1
functor ×1
node.js ×1
object ×1
shallow-copy ×1