【发布时间】:2015-06-20 19:48:23
【问题描述】:
所以我是第一次在 JavaScript 中进行一些对象操作,我有一个问题想知道是否有人可以回答。
当我有一个想要操作的对象时,我可以做一些嵌套 for 循环的事情,但是 JavaScript 中内置了一些函数,如 map/reduce/filter,以及 lodash/underscore 等库。
我认为后者(map/reduce/filter 和库)是更好的做法,但我只是好奇为什么。
我正在做一些非常基本的对象操作,可以通过一些放置良好的 for 循环来抓取和更改对象中正确的键/值来解决,但可以使用 JS 中的函数/库轻松完成。只是好奇它们如何变得更好——比如更好的性能/更简洁的代码/易用性/其他。
抱歉,没有代码。非常感谢任何人在这里帮助我了解更多信息。
编辑 - 因此从 map() 的示例中获取
我可以以 javascript.map 为例
var kvArray = [{key:1, value:10}, {key:2, value:20}, {key:3, value: 30}];
var reformattedArray = kvArray.map(function(obj){
var rObj = {};
rObj[obj.key] = obj.value;
return rObj;
});
我可以做类似的事情
var kvArray = [{key:1, value:10}, {key:2, value:20}, {key:3, value: 30}];
var reformattedArray = [];
for(var object in kvArray){
//combine both values into object inside of kvArray[object]);
};
代码少了很多 - 但还有其他值得了解的好处吗?
【问题讨论】:
-
酷 - 我什至不知道这些功能。看到你的标题后,我不得不搜索它。然后,我发现了这一点 - 关于您的主题,这似乎是一本非常好的读物:From Map/Reduce to JavaScript Functional Programming
-
Map 生成一个新数组。 Reduce 会累积某种单一的值或对象。如果它们提供了您需要的输出类型,您可以使用它们而不是 for 循环或 .for each。所有这些都是为某些类型的输出设计的专用迭代器。 for 循环是其他循环的超集。更通用,但需要更多输入。
-
@ajmajmajma 因为这完全取决于他想要什么。也许使用
map最适合他的情况,也许下划线_.some是或者也许filter...你能回答谁任何情况下的最佳实践?没有完美的方法对所有事情都是最好的。 -
有几次我测试了
.foreach()与普通for循环的性能,for循环每次都胜出。我没有测试过.map()或.reduce(),但如果不相似,我会感到惊讶。可能的问题是所有辅助函数都必须为循环的每次迭代调用函数回调,这是一些额外的开销,但for循环不需要这种开销。如果你真的想知道,你应该根据你的具体情况在几个浏览器中运行 jsperf 基准测试。 -
...从以前的评论继续 - 任何性能差异通常都没有意义,因此您应该使用使代码最干净的任何东西。
for循环还具有能够随时停止循环的优点,并且它适用于实际上不是数组的类数组结构(例如 HTMLCollection)。
标签: javascript