数组映射和筛选顺序

array map and filter order

本文关键字:顺序 筛选 映射 数组      更新时间:2023-09-26

我有一个对象数组:

[{'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 )可能是明智的。