【问题标题】:Use underscore to change one property of objects in an array使用下划线更改数组中对象的一个​​属性
【发布时间】:2015-08-24 19:44:07
【问题描述】:

我希望利用下划线来避免在我的代码库中编写for 循环。我正在使用map 代替for 循环,如下所示:

body.tags = _.map(body.tags, function(tag) {
  return {
    id: tag.id,
    userId: tag.userId,
    createDate: tag.createDate,
    tag: tag.tag.toLowerCase(),
  };
});

我的问题是,有没有办法在不指定不会改变的属性(除了tag)的情况下做到这一点?指定 id: tag.id 之类的字段似乎有点矫枉过正。

【问题讨论】:

  • body.tags 是数组吗?
  • @Amit,是的 body.tags 是一个对象数组,每个对象的结构都显示在 return 块中。
  • 如果您想继续使用您的_.map 方法,那么您可以说return _.extend(tag, { tag: tag.tag.toLowerCase() });。但是,使用forEach 的答案更好。

标签: javascript underscore.js


【解决方案1】:

你甚至不需要下划线:

body.tags.forEach(function(t) { t.tag = t.tag.toLowerCase();});

map(无论是原生、下划线还是其他)用于转换整个值,这不是典型的用例来做你试图用它做的事情。此外,使用简单的for 可能会执行得更好,因为这里不需要函数调用,但这取决于运行时优化。

顺便说一句,如果你用这个答案中的函数替换映射函数并且将返回值设置回body.tags,你也会得到你想要的结果。

【讨论】:

  • 这是正确的答案,你可以使用下划线/lodash 找到你想要操作的对象。 for 会更快,但是如果您没有数百万个项目,那么可以用简单的方法进行操作;)
  • 虽然使用不变性而不修改同一个对象总是更好,但如果深度克隆不太麻烦,请使用新对象。
【解决方案2】:

您可以尝试以下代码来使用下划线更改集合中的单个属性。

_.map(body.tags, function(tag) {
    tag.tag = tag.tag.toLowerCase();
    return tag;
});

与原生 forEach 及其性能相比,使用 lodash 的 map 方法(类似于下划线库)有一个好处。基于why lodash is faster than native forEach 帖子,也许使用 lodash 来支持下划线和原生 forEach 循环是合理的。但是,我同意下面评论“选择最可写、可读和可维护的方法”的用户。

【讨论】:

  • 为什么 OP 应该“试试这个”?一个好的答案总是会解释所做的事情以及这样做的原因,不仅适用于 OP,而且适用于 SO 的未来访问者。
  • 感谢杰伊布兰查德的反馈。我同意你所说的。我只是在回答OP提出的问题。显然,我并没有从未来访客的角度思考。今后我会牢记这一点。
  • 这不起作用,因为传递给 map 的函数不会返回任何内容。顺便说一句,性能是选择一种替代方案而不是另一种方案的最后一个原因。选择最可写、可读和可维护的方法。
  • 感谢指出错误 torazabouro,我已经更新了代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多