以不可变的方式更新数组中的一个对象

IT技术 javascript reactjs ecmascript-6 immutability
2021-03-25 06:22:47

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

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

假设我需要将具有 fieldName 的 state 对象更新cityIdtrue.

解决这个问题的最简单或最常见的方法是什么?

我可以使用任何库immutability-helperimmutable-js等或 ES6。我已经尝试并在谷歌上搜索了 4 个多小时,但仍然无法理解它。将非常感谢一些帮助。

4个回答

您可以使用map迭代数据并检查 fieldName,如果 fieldName 是 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 }); 
尽管这会遍历整个数组,而不管要更新的项目何时出现。
2021-06-14 06:22:47

这是一个示例示例 - ES6

左边是代码,而右边是输出

在此处输入图片说明

这是下面的代码

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

const newData = data.map(obj => {
  if(obj.fieldName === 'cityId') // check if fieldName equals to cityId
     return {
       ...obj,
       valid: true,
       description: 'You can also add more values here' // Example of data extra fields
     }
  return obj
});

const result = { data: newData }; 

console.log(result);

this.setState({ data: newData });

希望这会有所帮助,快乐编码!

@Derek 我认为这是可以实现相同目的的流行工具之一:getsharex.com
2021-05-24 06:22:47
您在屏幕截图中使用的程序的名称是什么?
2021-06-10 06:22:47

如何不变性辅助效果很好。你正在寻找$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
      }})
    }
})

坦率地说,这有点油腻,我打算改变我的状态对象的那部分,但它确实有效......听起来你不像在使用 redux,但策略应该是相似的。

@FellowStranger 肯定会使用不变性助手的更新功能。非常,非常有用。学习语法确实需要一段时间......
2021-05-23 06:22:47
问题是我已经尝试过了,但无法理解他们的语法如何替换对象数组中的值:/
2021-06-03 06:22:47
或者 update(formErrors, {2: {$merge: {valid: true}}})
2021-06-12 06:22:47
只需按照此处的示例进行操作:github.com/kolodny/immutability-helper#nested-collections你想valid在索引 2 处更新对象参数,所以像update(formErrors, {2: {valid: {$set: true}}})
2021-06-16 06:22:47

我强烈建议不要将值存储在数组中,而是建议使用对象,这样您就可以轻松指定要更新的元素。在下面的示例中,键是 fieldName 但它可以是任何唯一标识符:

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

那么你可以使用 immutability-helper 的update功能:

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