如何通过 unique keys/values 获取前 n 个对象

How to get first n objects by unique keys/values

我有一个包含数百个对象的数组,其中包含如下地理位置数据:

var geoArray = [
  {
    name: "a",
    latitude: 34.0500,
    longitude: 118.2500
    ...
  },
  {
    name: "b",
    latitude: 40.7127,
    longitude: 74.0059,
    ...
  },
  ...
];

我想抓取每个唯一 latitude/longitude 对的前 10 个对象,并将这些对象集放入一个新数组中。什么是实现这一目标的有效方法?我愿意使用 lodash 或下划线。

使用下划线的 uniq 我可以执行以下操作,但这只会让我得到第一个基于 lat/lng 的对象,而不是第一个 10:

_.uniq(geoArray,function(element) { return element.latitude + "_" + element.longitude});

这是_uniq的实际定义:

_.uniq(array, [isSorted], [iteratee])

我想要的功能基本上是这样的: _.uniq(array, [isSorted], [iteratee], [limit]) 其中 limit 默认为 1,但我想输入 10。我知道我可以先获取唯一的 lat/lng 对,然后找到哪些对象具有它们并将它们推送到一个数组最多 10 次,等等。但我希望有更有效的方法。

下面是应用下面非常有用的答案后有效的确切代码:

function getUnique(arr, limit) {
  var indices = [];
  var out = [];
  for (var i = 0, l = arr.length; i < l; i++) {
     var location = arr[i].latitude + '_' + arr[i].longitude;
     if (indices.indexOf(location) === -1) {
       out.push(arr.filter(function (el) {
         return el.latitude + '_' + el.longitude === location
       }).slice(0, limit));
       indices.push(location);
     }
  }
  return out;
}

现在我想我明白你的问题是什么了,this is the most efficient method我能想到。它 returns 一组具有相同 id 的对象组。您必须根据您的数据*调整它,但这是要点。

function getUnique(arr, limit) {
    var indices = [];
    var out = [];
    for (var i = 0, l = arr.length; i < l; i++) {
       var id = arr[i].id;
       if (indices.indexOf(id) === -1) {
         out.push(arr.filter(function (el) {
             return el.id === id;
         }).slice(0, limit));
         indices.push(id);
       }
    }
    return out;
}

getUnique(arr, 3);

DEMO

  • 我使用了一个简单的数组,因为我不想在这种情况下创建大量具有 lat/lon 坐标的对象。

使用 lodash 分组依据:

var grouped = _.groupBy(geoArray, function(item){return item.lat + ',' + item.long; };
var valuesByLocation = _.values(grouped);
var valuesByLocation_First10 = _.map(valuesByLocation, function(value){ return _.take(value, 10); });

您显然可以使用 _.partial 或链接将所有内容组合成一个衬垫。