2017-05-26 24 views
0

我有JavaScript對象替換數組值:如何使用lodash當標誌爲真

myData = { 
     items: [ 
     { 
      flag: false, 
      text: "good text" 
     }, 
     { 
      flag: true, 
      text: "good text" 
     }, 
     { 
      flag: false, 
      text: "good text" 
     } 
     ] 
    } 

我怎麼能到處更改文本,其中flag = true

例如,只有第二個對象需要從"good text"更改爲"bad text",因爲在我的示例中只有這個對象有flag = true

我想在JavaScript中使用Lodash來做到這一點。

回答

1

如果你必須使用lodash,這應該工作:

_.forEach(myData.items, function (item) { 
    if (item.flag) { 
    item.text = 'bad text'; 
    } 
}); 
0

您可以使用此片段更改文字。

myData.items = _.map(_.get(myData, 'items'), (item) => { 
    if (item.flag) { 
    item.text = "new text" 
    } 
    return item; 
}); 
+0

這不會起作用,因爲item.flag數據類型是數字,你把它比作一個字符串值。 –

+0

謝謝你指出。更新 –

0

你真的不需要lodash這個..

這裏是一個解決方案,而使用它

myData.items.forEach(item => item.text = item.flag ? "bad text" : item.text) 

const myData = { 
 
     items: [ 
 
     { 
 
      flag: false, 
 
      text: "good text" 
 
     }, 
 
     { 
 
      flag: true, 
 
      text: "good text" 
 
     }, 
 
     { 
 
      flag: false, 
 
      text: "good text" 
 
     } 
 
     ] 
 
    }; 
 

 
console.log(JSON.stringify(myData.items)); 
 

 
myData.items.forEach(item => item.text = item.flag ? "bad text" : item.text); 
 

 
console.log(JSON.stringify(myData.items));

0

如何:_(myData.items).filter('flag').each(x => x.text='bad text');

+0

它的工作原理,但它會循環兩次列表(第一個完整列表,然後過濾列表) –

+0

嗯......你確定,不要在鏈接函數時使用懶惰評估(每個文檔):https:// lodash.com/docs/4.17.4#chain – aquinas

+0

有趣的是,取決於有多少元素設置了標誌,lodash版本更快。請參閱:https://jsfiddle.net/1vxac6ex/1/。當i%10 == 0時,這將循環超過1000萬條記錄並將標誌設置爲true。如果我們總是設置標誌,那麼您的版本會快得多。你的版本的「問題」在於它爲每個項目設置屬性,即使它不需要。最終,我更喜歡你的版本。使用lodash沒有任何意義,但這正是OP想要的。 ¯\ _(ツ)_ /¯ – aquinas