2017-03-08 134 views
0

正嘗試使用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吹走你的狀態。 –

回答

0

你混合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

0

我想你應該使用.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

相關問題