更新基于另一个对象属性值的对象属性值失败

问题描述:

正尝试使用es6映射更新对象数组的属性值。我的逻辑有什么问题?更新基于另一个对象属性值的对象属性值失败

this.state = { 
     "fruits":[ 
     {"name":"banana","value":true}, 
     {"name":"watermelon","value":false}, 
     {"name":"lemon","value":false} 
     ] 
    } 

const key = 'lemon'; 
const newFruitsData = this.state.fruits.map(obj => 
     obj.name === key ? obj.value = true : ''  
    ) 

console.log(newFruitsData) 

无法弥补我的反应http://jsbin.com/jagononuwe/1/edit?js,console,output

+0

难道你不需要在'obj.name ===键的某个地方':'? obj [key] .value = true'?你为什么设置'obj [key] .value'而不是'obj.value'? –

+0

@MikeSamuel无法工作,http://jsbin.com/jagononuwe/1/edit?js,console,output – Mellisa

+0

那么,你正在将一个对象映射到它的一个属性或空字符串,所以setState吹走你的状态。 –

你混合ES6 mapArray.prototype.map[Array.prototype.map]

// demonstrates how to use ES6 MAP - The Map object is a simple key/value object. 

    var fruits= new Map(); 
    fruits.set('banana', true); 
    fruits.set('apple', false); 
    for (var [key, value] of fruits) { 
    console.log(key + ' = ' + value); 
    } 

Array.prototype.map方法不同 - 这造成的结果的新数组在此数组中的每个元素上调用提供的函数。点击上面提供的链接。

// to achieve what you are trying to do use `forEach` 

    this.state = { 
    "fruits":[ 
    {"name":"banana","value":true}, 
    {"name":"watermelon","value":false}, 
    {"name":"lemon","value":false} 
    ] 
} 

    const key = 'lemon'; 

    const newFruitsData = this.state.fruits.find(obj => { 
     if (obj.name === key) { 
       obj.value = false; 
     } 
    }); 

    const printNewData =() =>{ 
     this.state.fruits.forEach(obj => { 
      console.log(`${obj.name} ${obj.value}`); 
     }); 
    }; 

printNewData(); 
+0

那有什么不同?一样的。 – Mellisa

+0

因此经常用于反应的地图是数组地图?不是es6的地图?但它使用了babel,所以我认为它是es6 map – Mellisa

我想你应该使用.find进行这种操作。地图会为你制作一个新的阵列。用这种方式写,每次更新状态值时都必须重新分配一个新状态。查找会允许你(或其他方法)甚至允许你指定你想要更新的值。取决于其他代码,这可能更有效。

this.state = { 
    "fruits":[ 
    {"name":"banana","value":true}, 
    {"name":"watermelon","value":false}, 
    {"name":"lemon","value":false} 
    ] 
} 

const key = 'lemon'; 
const newFruitsData = this.state.fruits.find(obj => { 
    if (obj.name === key) obj.value = !obj.value 
}); 

console.log(this.state) 
+0

我更喜欢lodash的发现,因为它更快。但我卡在这里,需要你的帮助,http://jsbin.com/pujaducawa/1/edit?js,console,output 它没有我的现有对象。 – Mellisa

+0

嘿@梅丽莎我更新了它。点击功能现在可用。 http://jsbin.com/pujaducawa/1/edit?js,console,output –

+0

我仍然看到我的代码,你需要克隆/保存副本。 – Mellisa