2017-12-02 46 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

问题的更新。 –