数组映射和筛选顺序
array map and filter order
我有一个对象数组:
[{'message':'test...'},{'message':'50 chars...'}]
我正在使用数组映射和过滤器来返回所有包含 50 个字符以下消息的对象。
但是我想出了以下 2 个解决方案,它们都产生了相同的结果,它们在效率方面是否相同? 还是一个优于另一个....
function getShortMessages(messages){
return messages.map(function(item){
return item.message;
}).filter(function(message){
return message.length < 50;
})
}
在这里,我使用 map 将消息放入数组中,然后过滤消息数组(字符串)。
function getShortMessages(messages) {
return messages.filter(function(item) {
return item.message.length < 50
}).map(function(item) {
return item.message
})
}
在这个中,我得到了一个消息少于 50 个字符的对象数组,然后将消息放入一个数组中。
实现上述方法(最佳实践)的正确方法是什么?
我会使用reduce()
.如果我需要过滤和映射数据,它本质上是我会使用的。
此外,从函数内部删除任何幻数。 :)
var shortMessages = getShortMessages(messages, 50);
function getShortMessages(messages, length) {
return messages.reduce(function(result, item) {
if (item.message.length < length) {
result.push(item.message);
}
return result;
}, []);
}
就个人而言,您可以创建一个带有谓词函数的化简器,该函数充当过滤器。
// Retrieve random messages up to 70 characters long.
$.getJSON('http://www.json-generator.com/api/json/get/bLTLHYsXDm?indent=2',
function(messages) {
$.each(getShortMessages(messages, 70), function(index, message) {
$('<p>').text(message).appendTo('body');
});
});
// Define message length predicate and map callback.
function getShortMessages(messages, limit) {
return mapReducer(messages, function() {
return this.message.length < limit;
}, function() {
return this.message;
});
}
// Combine map and filter, using a reduce function.
function mapReducer(list, filterFn, mapperFn) {
return list.reduce(function(result, item, index, arr) {
if (filterFn.call(item, item, index, arr)) {
result.push(mapperFn.call(item, item, index, arr));
}
return result;
}, []);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
如果你先filter
,你最终会map
到一个最多是原始数组长度的数组。因此,如果您正在寻找微优化,您应该先filter
,然后map
。
然而,在实践中,两者都很好(只有当你的原始列表很长并且map
转换非常昂贵时,这才会成为一个问题。在这种情况下,遵循@MrPolywhirl的答案并使用不同的方法(即使用 reduce
)可能是明智的。
相关文章:
- ajax请求的顺序总是不同的
- 按照选项卡索引的顺序循环一个jQuery选择
- 匹配一个单词,其中候选人可以跨越顺序组(跨度)
- 使用AngularJS中的筛选器更新给定的表
- 按顺序添加和删除类
- 淘汰搜索/筛选
- 按我自己的类克隆另一个元素的内容和顺序
- AngularJS单选筛选不适用于Name、Description和Field4复选框值
- Javascript-根据赋值顺序,按键合并对象数组
- Angular JS Filter-通过3个复选框进行筛选
- 2个backbone.js集合,具有相同的模型,但排序顺序不同
- querySelector/getElementByClassName嵌套项的顺序
- 使用下拉列表筛选列表(ul>li)
- 以不同的顺序输出数据
- 重新排列HTML元素的顺序并更改内容
- 在Javascript中列出顺序子集元素
- 是否“;对于的“;循环迭代遵循JavaScript中的数组顺序
- 调节顺序按筛选器
- AngularJS Scope.on和Scope.emit在筛选器中的调用顺序
- 数组映射和筛选顺序