2016-09-21 52 views
0

我有這樣的對象如何變異對象而不重複?

var originalObj = { 
    shop: [ 
    { id: 1, list: "buy milk", complete: false}, 
    { id: 2, list: "buy bread", complete: false} 
    ] 
} 

我想第一個項目更改爲complete: true

var newObj = Object.assign({}, originalObj, { 
    ['shop']: [ 
    {...originalObj['shop'][0] 
     complete: true}, ...originalObj['shop'] 
    ] 
}) 

這樣做的問題是,newObj與三個對象結束了,其中一個我想編輯得到重複。

+0

是否有更多的潛在問題比滿足眼睛?爲什麼不只是'originalObj.shop [0] .complete = true'? –

+0

@JamesThorpe但我不想更改原始對象 – relidon

+0

這是因爲您添加了整個店鋪數組後,添加此對象{... originalObj.shop [0],完成:true} – inoabrian

回答

1

深拷貝可能有問題的某個時候。當被分配的屬性是對象時,Object.assign()複製屬性引用。最好你可以使用下面的方法。

var originalObj = { 
    shop: [ 
    { id: 1, list: "buy milk", complete: false}, 
    { id: 2, list: "buy bread", complete: false} 
    ] 
}; 
var newObj = JSON.parse(JSON.stringify(originalObj)); 
newObj.shop[0].complete = true; 
0

我的評論:「這是因爲你在後面加上整店數組,添加此物後{... originalObj.shop [0],完整的:真正}」

的... originalObj.shop正在傳播整個陣列。 所以你有這樣的

[{the newly edited object with complete = true}, ...originalObj.shop] 
...originalObj.shop looks like this : 
[{ id: 1, list: "buy milk", complete: false}, 
{ id: 2, list: "buy bread", complete: false}] 

在我的答案我篩選 「老」{ID:1,表: 「買牛奶」,完整的:假}出來。

var changeObject = function(index, objectToEdit){ 
 
    var newObject = {}; 
 
    newObject = Object.assign({}, originalObj.shop[index]); 
 
    newObject.complete = true; 
 
    return newObject; 
 
}; 
 

 
var originalObj = { 
 
    shop: [ 
 
    { id: 1, list: "buy milk", complete: false}, 
 
    { id: 2, list: "buy bread", complete: false} 
 
    ] 
 
}; 
 

 
var changedObj = changeObject(0, originalObj); 
 
var unchangedObjs = originalObj.shop.filter(sobj => { 
 
    if(sobj.id != changedObj.id) 
 
    return sobj; 
 
}); 
 

 
var newObj = { 
 
    'shop': [ 
 
    changedObj, 
 
    ...unchangedObjs 
 
    ] 
 
}; 
 

 
console.log(JSON.stringify(newObj));

只注意到我的回答完全避免你想要的解決方案。 因此,這裏是你想要的解決方案:

var newObj = { 
    'shop': [ 
    {...originalObj.shop[0], complete:true}, 
    ...originalObj.shop.filter(so => {return so.id != originalObj.shop[0].id}) 
    ] 
}; 
相關問題