Javascript 数组映射和过滤器顺序

Javascript 数组映射和过滤器顺序,javascript,arrays,Javascript,Arrays,我有一个对象数组: [{'message':'test...'},{'message':'50 chars...'}] 我使用数组映射和过滤器返回消息少于50个字符的所有对象 然而,我提出了以下两种解决方案,它们都产生相同的结果,它们在效率方面是否相同?还是一个比另一个更受欢迎 function getShortMessages(messages){ return messages.map(function(item){ return item.message; }).filt

我有一个对象数组:

[{'message':'test...'},{'message':'50 chars...'}]
我使用数组映射和过滤器返回消息少于50个字符的所有对象

然而,我提出了以下两种解决方案,它们都产生相同的结果,它们在效率方面是否相同?还是一个比另一个更受欢迎

function getShortMessages(messages){
  return messages.map(function(item){
    return item.message;
  }).filter(function(message){
    return message.length < 50;
  })
}
函数getShortMessages(消息){
返回消息.map(函数(项){
返回item.message;
}).过滤器(功能(消息){
返回消息长度<50;
})
}
在本文中,我使用map将消息获取到一个数组中,然后过滤消息数组(字符串)

函数getShortMessages(消息){
返回消息。筛选器(函数(项){
return item.message.length<50
}).map(功能(项目){
返回item.message
})
}
在这个例子中,我得到一个对象数组,其中消息少于50个字符,然后我将消息放入一个数组中

实现上述方法(最佳实践)的正确方法是什么?

我会使用
reduce()
。如果我需要过滤和映射数据,基本上我会使用它

另外,从函数中删除所有幻数。:)

var shortMessages=getShortMessages(messages,50);
函数getShortMessages(消息,长度){
返回消息.reduce(函数(结果,项){
如果(item.message.length

就个人而言,您可以使用充当过滤器的谓词函数创建一个reducer

//检索长度不超过70个字符的随机消息。
$.getJSON('http://www.json-generator.com/api/json/get/bLTLHYsXDm?indent=2',
功能(信息){
$.each(getShortMessages(messages,70),函数(index,message){
$(“”).text(message).appendTo('body');
});
});
//定义消息长度谓词和映射回调。
函数getShortMessages(消息,限制){
返回mapReducer(消息,函数(){
返回此.message.length

如果您先
筛选
,则最后将
映射
到一个最多为原始数组长度的数组上。因此,如果您正在寻找微优化,您应该首先
筛选
,然后
映射


但是,在实践中,两者都可以(只有当原始列表很长并且
map
转换非常昂贵时,这才会成为一个问题。在这种情况下,遵循的答案并使用不同的方法(即使用
reduce
)可能是明智的.

你能使用第三部分库吗?如果可以,你可以看到underline.js,我喜欢
messages.map(函数(x){return x.y.length<50&&x.y;})。filter(Boolean)
:最小迭代,最小手工代码。reduce的一个缺点是它的可组合性较差(无法独立调整criteria和pull)并且不使用纯函数回调。。。
function getShortMessages(messages) {
 return messages.filter(function(item) {
   return item.message.length < 50
 }).map(function(item) {
   return item.message
 })
}