Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 以不变的方式更新数组中的一个对象_Javascript_Reactjs_Ecmascript 6_Immutability - Fatal编程技术网

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

Javascript 以不变的方式更新数组中的一个对象,javascript,reactjs,ecmascript-6,immutability,Javascript,Reactjs,Ecmascript 6,Immutability,在React的this.state中,我有一个名为formErrors的属性,其中包含以下对象的动态数组 [ {fieldName: 'title', valid: false}, {fieldName: 'description', valid: true}, {fieldName: 'cityId', valid: false}, {fieldName: 'hostDescription', valid: false}, ] 假设我需要将具有fieldNamecityId

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

[
  {fieldName: 'title', valid: false}, 
  {fieldName: 'description', valid: true},
  {fieldName: 'cityId', valid: false},
  {fieldName: 'hostDescription', valid: false},
]
假设我需要将具有fieldName
cityId
的state对象更新为有效值
true

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

我可以使用任何库等或ES6。我已经用谷歌搜索了4个多小时了,但仍然无法用头脑去理解它。非常感谢您的帮助。

怎么样?效果很好。我想您正在寻找
$merge
命令

@FellowStranger:我的redux状态有一个(而且只有一个)部分是一个对象数组。我使用reducer中的索引来更新正确的条目:

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,但策略应该是类似的。

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

这样写:

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 }); 

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

var fields = {
    title: {
        valid: false
    },
    description: {
        valid: true
    }
}
然后您可以使用immutability helper的
update
函数:

var newFields = update(fields, {title: {valid: {$set: true}}})
下面是一个示例—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 });
希望这有帮助,
快乐编码

是否尝试在数组上迭代,如果
fieldName===“cityId”
,则将
valid
设置为
true
?这似乎很简单。。。。我错过了什么?如果您发布了一些您尝试过的内容,可能会有所帮助。我的想法与@alexanderbird相同,那么您是否有特定的性能要求?我的问题是如何处理。问题是,我尝试过它,但无法理解它们的语法如何替换对象数组中的值:/只需遵循以下示例:。您希望更新索引2处对象的
valid
参数,因此类似于
update(formErrors,{2:{valid:{$set:true}}}})
update(formErrors,{2:{$merge:{valid:true}}})
@FellowStranger.futz以及不变性助手的更新函数。非常非常有用。学习语法确实需要一段时间……尽管这将在整个数组中迭代,而不管要更新的项目何时出现。您在屏幕截图中使用的程序的名称是什么?@Derek我认为这是可以实现相同功能的常用工具之一:@Derek看起来像