2015-09-27 26 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或鏈接一個襯墊。

相關問題