2017-05-26 74 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