Javascript 如何变换和过滤数组
我有一个Javascript 如何变换和过滤数组,javascript,arrays,algorithm,object,Javascript,Arrays,Algorithm,Object,我有一个数组,其中包含如下对象: [ { latitude: 00, longitude: 11 }, { latitude: 22, longitude: 33 }, { latitude: 00, longitude: 11 }, ] 我想将该数组转换并过滤为另一个数组,该数组包含数组,其中包含对象: 如果经度和纬度相等,则它们应位于同一数组中,因此,我需要一个新数组,如下所示: [ [ {
数组
,其中包含如下对象:
[
{
latitude: 00,
longitude: 11
},
{
latitude: 22,
longitude: 33
},
{
latitude: 00,
longitude: 11
},
]
我想将该数组转换并过滤为另一个数组,该数组包含数组,其中包含对象:
如果经度和纬度相等,则它们应位于同一数组中,因此,我需要一个新数组,如下所示:
[
[
{
latitude: 00,
longitude: 11
},
{
latitude: 00,
longitude: 11
}
],
[
{
latitude: 22,
longitude: 33
}
]
]
您可以使用
纬度
和经度
创建一个唯一键,并为对象累加器中的每个唯一键按数组中的每个对象。然后使用Object.values()
提取所有值
const data=[{纬度:00,经度:11},{纬度:22,经度:33},{纬度:00,经度:11},],
结果=Object.values(data.reduce((r,{纬度,经度})=>{
常数键=纬度+经度;
r[键]=r[键]| |[];
r[key].push({纬度,经度});
返回r;
},{}));
控制台日志(结果)代码>您可以将数组缩减为一个对象,其中纬度和经度形成一个唯一的键,并推送与之对应的值。然后使用Object.values返回数组
试着跟随
var arr=[{纬度:00,经度:11},{纬度:22,经度:33},{纬度:00,经度:11}];
var map=arr.reduce((a,c)=>{
var key=c.纬度+“”+c.经度;
a[键]=a[键]| |[];
a[键]。按(c);
返回a;
}, {});
console.log(Object.values(map))
将
缩减为一个对象,该对象的键表示数组对象的内容,其值为数组,并创建/推送到相应的数组:
const input=[{纬度:00,经度:11},{纬度:22,经度:33},{纬度:00,经度:11},]
常量输出=Object.values(
输入.减少((a,obj)=>{
const key=JSON.stringify(obj);
如果(!a[key])a[key]=[];
a[键]。推送(obj);
返回a;
}, {})
)
控制台日志(输出)代码>这是过滤的解决方案,首先将数据分组,然后将其压缩为字符串
vara=[{纬度:21,经度:12},{纬度:211,经度:2},];
映射的var=a.reduce((acc,e)=>{
变量键=''+e.纬度+'',''+e.经度;
如果(!acc[key])acc[key]=[e];
else acc[键]。按下(e);
返回acc;
}, {});
log(Object.keys(mapped.map)((key)=>mapped[key]);
//编辑
console.log(Object.values(映射));
我建议您在JSON
对象添加更新count
中添加count字段,如果您两次发现相同的元素,否则上面的答案看起来不错
var数据=[{
纬度:00,,
经度:11
},
{
纬度:22,
经度:33
},
{
纬度:00,,
经度:11
},
]
var结果=[];
data.forEach(val=>{
常量filterIndex=result.findIndex(v=>v.latitude==val.latitude&&v.longitude==val.longitude);
filterIndex==-1?结果.push({…val,
计数:1
}):结果[filterIndex]。计数+=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}]);
}
}
你想干什么?查看输入的预期输出,[{经度:11,经度:00},{经度:22,经度:33},{经度:00,经度:11},]
?请注意,如果相同对象属性的顺序不同,则JSON.stringify
将创建不同的字符串。这意味着,如果纬度和经度属性是不同的,则当前接受的答案将在相同的纬度和经度下对不同的数组进行分组。OP可以考虑或不考虑输入的工作,<代码> const输入= [{经度:11,纬度:00 },{纬度:22,经度:33 },{纬度:00,经度:11 },〕
不适用于输入,常量a=[{纬度:21,经度:12},{纬度:211,经度:2},]
两个控制台日志调用似乎都将两个对象分组到一个数组中。OP似乎要求的是,只有当对象的经度和纬度值相同时,才将对象分组到同一数组中。@!谢谢!:)