如何通过 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);
- 我使用了一个简单的数组,因为我不想在这种情况下创建大量具有 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 或链接将所有内容组合成一个衬垫。
我有一个包含数百个对象的数组,其中包含如下地理位置数据:
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);
- 我使用了一个简单的数组,因为我不想在这种情况下创建大量具有 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 或链接将所有内容组合成一个衬垫。