2015-09-27 64 views
-2

我有一个数组有上百个对象包含地理定位数据,像这样:如何通过独特的密钥来获得第一n个对象/值

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

我想抓住每一个独特的经/纬度的第10个对象将这些对象集合放入一个新数组中。什么是实现这一目标的有效方法?我愿意使用lodash或下划线。

使用下划线的uniq我能做到以下几点,但这只让我基于纬度/经度而不是第10的第一个对象:

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

这是_uniq的实际定义:

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

我需要的功能基本上会看起来像: _.uniq(array, [isSorted], [iteratee], [limit])其中limit默认是1,但我想如T o输入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; 
} 
+0

您应该在问题中发布您尝试的代码。请不要指望我们为您解决问题,而不是先尝试自己解决问题。 – Andy

回答

1

现在我想我明白你的问题是关于,this is the most efficient method我能想到的是什么。它返回具有相同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

  • 我用一个简单的数组,因为我不希望有创建大量在这种情况下经/纬度COORDS对象。
+1

Reduce需要处理整个序列。几百个元素不是什么大不了的,但它不能提前终止。 – user2864740

+0

另外,我认为我们可能都读过错误的问题。 – user2864740

+0

谢谢,但是这给了我基于lat/lng的前10个独特对象,而不是每个独特的lat/lng的前10个对象。我的目标基本上是下划线的'uniq'方法,但前10个事件返回,而不仅仅是第一个1. – MattDionis

0

使用由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或链接一个衬垫。

相关问题