提问人:Jatin Raikwar 提问时间:6/20/2018 更新时间:6/20/2018 访问量:3572
在 Javascript 中分配对象内部的数组
Assigning array inside object in Javascript
问:
我有和全局变量。cart
products
产品可以具有多个属性。
这是一个代码
var products = [
{
name: 'Table',
price: 200,
attributes: [
{
name: 'Height',
type: 'text',
default_value: '',
},
{
name: 'Width',
type: 'text',
default_value: '',
}
],
},
{
name: 'Chair',
price: 150,
attributes: [
{
name: 'Height',
type: 'text',
default_value: '',
},
{
name: 'Width',
type: 'text',
default_value: '',
},
{
name: 'Company',
type: 'text',
default_value: ''
}
],
}
];
var cart = {
products: [],
};
//console.log('Initial cart',cart);
//add product to cart
let p = Object.assign({},products[0]);
cart.products.push(p);
//console.log('First cart', cart);
//change price
cart.products[0].price = 20;
//console.log('products',products);
//console.log('second cart',cart);
//change attribute of product
cart.products[0].attributes[0].value = 5;
此代码更改全局属性,而不是购物车属性。products
value
请帮我解决这个问题。
答:
1赞
Muhammad Usman
6/20/2018
#1
来自 MDN
Object.assign()
复制属性值。如果源值是对对象的引用,则它仅复制该引用值。
就像数据中的对象一样,这就是您面临这种浅拷贝问题的原因products[0]
相反,您可以使用
let p = JSON.parse(JSON.stringify(products[0]));
var products = [{
name: 'Table',
price: 200,
attributes: [{
name: 'Height',
type: 'text',
default_value: '',
},
{
name: 'Width',
type: 'text',
default_value: '',
}
],
},
{
name: 'Chair',
price: 150,
attributes: [{
name: 'Height',
type: 'text',
default_value: '',
},
{
name: 'Width',
type: 'text',
default_value: '',
},
{
name: 'Company',
type: 'text',
default_value: ''
}
],
}
];
var cart = {
products: [],
};
//console.log('Initial cart',cart);
//add product to cart
let p = JSON.parse(JSON.stringify(products[0]));
cart.products.push(p);
//console.log('First cart', cart);
//change price
cart.products[0].price = 20;
console.log('products',products);
console.log('second cart',cart);
评论
1赞
Jatin Raikwar
6/20/2018
那我该怎么办?@GeorgeBailey
0赞
libik
6/20/2018
#2
您仅使用 Object.assign 创建浅拷贝,这会导致通过复制的引用访问内存中的相同对象。
如果我需要修改通过引用传递的对象或全局对象,并且我不想为代码的所有其他函数/部分改变它,我使用这个: https://lodash.com/docs/4.17.10#cloneDeep
let p = _.cloneDeep(products[0]);
上一个:这两种方法有什么区别
评论
lodash.cloneDeep
p = JSON.parse(JSON.stringify(products[0]))