我有array
这样的对象:
[
{
latitude: 00,
longitude: 11
},
{
latitude: 22,
longitude: 33
},
{
latitude: 00,
longitude: 11
},
]
我想将该数组转换并过滤到另一个数组,该数组包含包含对象的数组:
如果经度和纬度相等,它们应该转到同一个数组,所以,我需要一个像这样的新数组:
[
[
{
latitude: 00,
longitude: 11
},
{
latitude: 00,
longitude: 11
}
],
[
{
latitude: 22,
longitude: 33
}
]
]
答案 0 :(得分:4)
reduce
到一个对象,其键代表数组对象'内容,其值为数组,并创建/推送到适当的数组:
const input=[{latitude:00,longitude:11},{latitude:22,longitude:33},{latitude:00,longitude:11},]
const output = Object.values(
input.reduce((a, obj) => {
const key = JSON.stringify(obj);
if (!a[key]) a[key] = [];
a[key].push(obj);
return a;
}, {})
)
console.log(output);

答案 1 :(得分:2)
我建议您在JSON
对象添加更新count
中添加计数字段,如果您找到相同的元素两次,否则上面的答案看起来不错。
var data = [{
latitude: 00,
longitude: 11
},
{
latitude: 22,
longitude: 33
},
{
latitude: 00,
longitude: 11
},
]
var result = [];
data.forEach(val => {
const filterIndex = result.findIndex(v => v.latitude == val.latitude && v.longitude == val.longitude);
filterIndex == -1 ? result.push({ ...val,
count: 1
}) : result[filterIndex].count += 1;
});
console.log(result);
答案 2 :(得分:1)
您可以使用latitude
和longitude
创建唯一键,并为对象累加器中的每个唯一键推送数组中的每个对象。然后使用Object.values()
提取所有值。
const data = [ { latitude: 00, longitude: 11 }, { latitude: 22, longitude: 33 }, { latitude: 00, longitude: 11 }, ],
result = Object.values(data.reduce((r,{latitude, longitude}) => {
const key = latitude + '_' + longitude;
r[key] = r[key] || [];
r[key].push({latitude, longitude});
return r;
},{}));
console.log(result);

答案 3 :(得分:1)
您可以将数组缩减为具有纬度和经度的对象,形成唯一键并推送与其对应的值。然后使用Object.values
返回数组尝试以下
var arr = [ { latitude: 00, longitude: 11 }, { latitude: 22, longitude: 33 }, { latitude: 00, longitude: 11 }];
var map = arr.reduce((a,c) => {
var key = c.latitude + "_" + c.longitude;
a[key] = a[key] || [];
a[key].push(c);
return a;
}, {});
console.log(Object.values(map));

答案 4 :(得分:1)
这是过滤的解决方案,首先减少组中的数据,然后连接到字符串。
var a = [{latitude:21,longitude:12},{latitude:211,longitude:2},];
var mapped = a.reduce((acc, e) => {
var key = '' + e.latitude + ','+ e.longitude;
if (!acc[key]) acc[key] = [e];
else acc[key].push(e);
return acc;
}, {});
console.log(Object.keys(mapped).map((key) => mapped[key]));
// edit
console.log(Object.values(mapped));

答案 5 :(得分:1)
您可以使用哈希表的组合键来加速重复查找:
const result = [], hash = {};
for(const {latitude, longitude} of array) {
const key = latitude + "_" + longitude;
if(hash[key]) {
hash[key].push({longitude, latitude});
} else {
result.push(hash[key] = [{longitude, latitude}]);
}
}