数组地图和过滤顺序

时间:2016-03-10 20:19:37

标签: javascript arrays

我有一个对象数组:

[{'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个字符的对象数组,然后我将消息放入数组中。

实现上述方法的最佳实践方法是什么?

2 个答案:

答案 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)。