2017-02-19 37 views
2

我的主要對象是這樣的:如何使用Object.assign()分配嵌套對象?

const obj = { 

    data: { 
     'Puppies' : [], 
     'Kittens': [] 
    } 
}; 

我想在data.Puppies值分配給數據字段[0]。

當我試圖做到這一點使用Object.assign()我得到一個錯誤:

Unexpected token, expected , (83:12) 

    81 | 
    82 |  return Object.assign({}, obj, { 
> 83 |   data.Puppies[0]: list 
    |   ^
    84 |  }); 
    85 | } 
    86 | 

我不知道我怎麼能完成我的任務。 我需要使用Object.assign(),因爲我需要返回一個不是原始對象的新對象。我這樣做是因爲ReactJS中的Redux Reducer。

+0

所以基本上cou需要從obj中獲得一個拷貝,並且在索引零處的'Puppies'中有一個新項目而不會改變原始對象,對嗎? –

回答

0

ES6沒有突變的方式:

const obj = { 
 
    data: { 
 
     'Puppies' : [], 
 
     'Kittens': [] 
 
    } 
 
}; 
 

 
const data = Object.assign({}, obj.data, { 
 
       Puppies: [...obj.data.Puppies, 'newValue'] 
 
      });  
 
const newObject = Object.assign({}, obj, {data}); 
 
console.log(newObject);

0

您可以分配外部對象和分配給數組索引0新的內容,而變異原obj

const list = ['foo', 'bar']; 
 
const obj = { data: { Puppies: [], Kittens: [] } }; 
 

 
console.log(Object.assign({}, obj, { data: { Puppies: Object.assign([], obj.data.Puppies, { 0: list }) } })); 
 
console.log(obj);

Puppies內容是相同的。

const list = ['foo', 'bar']; 
 
const obj = { data: { Puppies: ['bar', 42], Kittens: [] } }; 
 

 
console.log(Object.assign({}, obj, { data: { Puppies: Object.assign([], obj.data.Puppies, { 0: list }) } })); 
 
console.log(obj);

+0

如果小狗和小貓可能會改變呢?如何可變的小貓? – user1261710

+0

然後你可以使用'Kitten'的模式以及'{data:{Kitten:Object.assign([],obj.data.Kitten,{0:data})}}' –

+0

NO我的意思是說,編碼的小狗和小貓。如果我們不知道它是哪一個呢? – user1261710

0

list一個新的數組元素0和小狗開始1元,其餘更換小狗,所以有效地取代元素0

var obj = { data: { 'Puppies': [], 'Kittens': [] } }; 
var list = [ 'a', 'b' ]; 

var n = Object.assign({}, obj, { 
    data: Object.assign({}, obj.data, { 
    Puppies: [ list ].concat(obj.data.Puppies.slice(1)) 
    }) 
}); 

console.log(obj); 
console.log(n); 
0

你可以試試使用Ramdajs鏡頭實現此目的

const obj = { 
    data: { 
     'Puppies' : [], 
     'Kittens': [] 
    } 
}; 

const list = [1,2,3,4]; 
const xlens = R.lensPath(['data', 'Puppies']) 
console.log(R.set(xlens, list, obj)) 

Here是代碼排斥

+0

,,你癡迷於ramda。 –

+0

沒有錯,但只編輯他人的答案和注入這個可憐的圖書館 –