2017-05-04 21 views
5

在React的this.state中,我有一个名为formErrors的属性,其中包含以下动态数组对象。以不可变的方式更新数组中的一个对象

[ 
    {fieldName: 'title', valid: false}, 
    {fieldName: 'description', valid: true}, 
    {fieldName: 'cityId', valid: false}, 
    {fieldName: 'hostDescription', valid: false}, 
] 

比方说,我需要更新具有字段名cityId状态的对象的true有效值。

解决此问题的最简单或最常用的方法是什么?

我可以使用任何库immutability-helper,immutable-js等或ES6。我已经试了4个多小时,并且仍然无法用头围住它。将非常感谢一些帮助。

+0

你尝试遍历数组了,而如果'fieldName ==='cityId'然后将'valid'设置为'true'?这看起来很直截了当......我错过了什么?如果你发布了一些你尝试过的东西,它可能会有所帮助。 – alexanderbird

+0

我也像@alexanderbird一样思考,所以你有特定的性能要求? –

+0

我的问题是关于处理[不可变数据](https://facebook.github.io/react/docs/update.html)。 –

回答

6

您可以使用map迭代数据并检查字段名,如果字段名是cityId那么你需要改变的价值和返回一个新的对象否则只是return相同object

写这样的:

var data = [ 
    {fieldName: 'title', valid: false}, 
    {fieldName: 'description', valid: true}, 
    {fieldName: 'cityId', valid: false}, 
    {fieldName: 'hostDescription', valid: false}, 
] 

var newData = data.map(el => { 
        if(el.fieldName == 'cityId') 
        return Object.assign({}, el, {valid:true}) 
        return el 
       }); 

this.setState({ data: newData }); 
1

immutability-helper怎么样?工作得很好。您正在寻找我认为的$merge命令。

@FellowStranger:我有一个(并且只有一个)我的redux状态部分是一个对象数组。我用的是指数在减速更新正确的条目:

case EMIT_DATA_TYPE_SELECT_CHANGE: 
    return state.map((sigmap, index) => { 
    if (index !== action.payload.index) { 
     return sigmap; 
    } else { 
     return update(sigmap, {$merge: { 
     data_type: action.payload.value 
     }}) 
    } 
}) 

坦率地说,这是一种油腻,我打算改变我的状态对象的一部分,但它的工作......一点也没有”听起来像你正在使用REDX,但策略应该是相似的。

+0

问题是我已经尝试过,但无法理解它们的语法如何替换对象数组中的值:/ –

+0

只需按照以下示例进行操作:https://github.com/kolodny/immutability-helper#nested-collections 。你想更新index 2对象的'valid'参数,比如'update(formErrors,{2:{valid:{$ set:true}}})' – Hamms

+1

或'update(formErrors,{2: {$ merge:{valid:true}}})' – Hamms

1

而是在阵列中存储你的价值观,我强烈建议使用一个对象,而不是让您可以轻松地指定要更新哪个元素。在按键下面的例子是字段名,但它可以是任何唯一的标识符:

var fields = { 
    title: { 
     valid: false 
    }, 
    description: { 
     valid: true 
    } 
} 

那么你可以使用不变性辅助的update功能:

var newFields = update(fields, {title: {valid: {$set: true}}}) 
相关问题