2017-12-02 79 views
1

我想在陣營無法創建一個對象數組結構和增加值到數組

{ 
items: 
    {Dogs: [{name: "Snoopy"}, {name: "Lola"}, {name: "Sprinkles"}], 
    Cats: [{name: "Felidae"}, {name: "Garfiled"}, {name: "Cat in the Hat"}] 
} 

使用下面的函數來創建以下結構:

handleAddItem(s) { 

    var key = Object.keys(s)[0]; 
    var value = s[key]; 

    var allItems = {...this.state.items}; 

     allItems[key] = allItems[key]; 
     allItems[key].push({name: value}); 


    var ourItems = {}; 
     ourItems = allItems[key]; 
     ourItems.push({name: value }); 

    // console.log(ourItems); 
    // console.log(allItems); 

    this.setState({items: allItems}); 

} 

爲什麼是關鍵值對被添加到狀態兩次?

+1

是小寫字母和單數鍵「狗」和「貓」是拼寫錯誤嗎?不應該是複數「狗」,「貓」? –

回答

2

修改您handleAddItem喜歡的東西下面。您的方法缺少Object.keys(s)[0]。 Object.keys將返回一個數組,以便您獲得確切的密鑰並假定它始終是單個密鑰對象,則需要訪問第零個索引。

同樣在React中,不要試圖改變狀態變量,總是使用...或其他深層克隆技術創建數組或對象變量的深層副本。

handleAddItem(s) { 

//s comes in as an object key/value pair e.g. Dogs: Blackie  

    // Your expected key is at the 0th index 
    var key = Object.keys(s)[0]; 
    var value = s[key]; 

    // Cloning to prevent state mutations 
    var allItems = {...this.state.items}; 

    var allItems[key] = allItems[key] || []; 
     allItems[key].push({name: value }); 

    this.setState({items: allItems}); 
} 
+0

你能看看我更新的問題。爲什麼要將鍵值對添加到狀態兩次? – DCR

+0

看起來像你找到了問題。你與我的代碼混合在一起。另外,請不要如此激烈地更改問題中的內容。其他答案可能看起來不符合上下文。 –

+0

似乎是我們通過參考傳遞的原因。但是我想知道你是否可以這樣設置狀態? – DCR

0

編輯:請注意,您的問題中的示例不是一個有效的JS對象,因爲您有一些不匹配的括號。

如果你有一個看起來像這樣的結構。

const object = { 
    items: { 
    dogs: [], 
    cats: [] 
    } 
} 

要追加到嵌套狗數組,你可以這樣做:object.items.dogs.push({ name: "Snoopy" })

1

如果給你一個動態密鑰,那麼你可以參考的對象鍵用括號:

myObj['myKey'] = 'myValue' 

可以使用擴展語法添加數組和對象:

const myNewDogs = [{ 
 
    name: 'new dog 1' 
 
}, { 
 
    name: 'new dog 2' 
 
}]; 
 
const myNewCat = { 
 
    name: 'new cat' 
 
}; 
 
const items = { 
 
    dogs: [{ 
 
     name: 'dog 1' 
 
    }, 
 
    { 
 
     name: 'dog 2' 
 
    }, 
 
    { 
 
     name: 'dog 3' 
 
    } 
 
    ], 
 
    cats: [{ 
 
     name: 'cat 1' 
 
    }, 
 
    { 
 
     name: 'cat 2' 
 
    }, 
 
    { 
 
     name: 'cat 3' 
 
    } 
 
    ] 
 
}; 
 

 
items['dogs'] = [...items['dogs'], ...myNewDogs]; 
 
items['cats'] = [...items['cats'], {...myNewCat}]; 
 
console.log(items);

注意對象傳播語法的建議but already on stage 3這是

+0

沒有工作。因爲[Object.keys](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys)返回的數組不是密鑰,因此請參閱 – DCR

+0

問題的更新。 –