我有一个对象数组:
[{'message':'test...'},{'message':'50 chars...'}]
我正在使用数组映射和过滤器来返回包含50个字符以下消息的所有对象。
然而,我想出了以下两个产生相同结果的解决方案,它们在效率方面是否相同?或者是一个优先于另一个......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个字符的对象数组,然后我将消息放入数组中。
实现上述方法的最佳实践方法是什么?
答案 0 :(得分:2)
我会使用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;
}, []);
}
就个人而言,您可以创建一个带谓词函数的reducer,它充当过滤器。
// 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>
答案 1 :(得分:0)
如果先filter
,您将最终map
一个最多为原始数组长度的数组。因此,如果您正在寻找微观优化,则应首先filter
,然后map
。
然而,在实践中,要么是好的(如果您的原始列表非常长并且map
转换非常昂贵,这只会成为一个问题。在这种情况下,遵循{{ 3}}回答并使用不同的方法(即使用reduce
)。