我有一个多维的远足径数组,每个远足径都有一个ID和一个坐标列表,如下所示:
[{id:10, coords:[{15, 69}, {16, 85}, {16, 34}]},
{id:20, coords:[{15, 69}, {16, 85}, {16, 34}]},
{id:30, coords:[{15, 69}, {16, 85}, {16, 34}]},
{id:10, coords:[{15, 69}, {16, 63}]},
{id:50, coords:[{15, 69}, {16, 85}, {16, 34}]}]
我想删除重复的项目,这意味着具有相同ID的项目,但要保留坐标列表较长的项目。
对于我来说,删除具有相同ID的项目没问题,但是我不知道如何定义保留哪个项目。我认为它始终是第一个保留的项目。
这是我尝试过的。我想检查哪个坐标更长,然后保留其中一个并删除另一个。
for(let i = 0; i < array.length; i++) {
for(let j = i + 1; j < array.length; ) {
if(array[i].id === array[j].id && array[i].coordinates.length > array[j].coordinates.length)
array.splice(j, 1);
else if(array[i].id === array[j].id && array[i].geometry.coordinates.length < array[j].geometry.coordinates.length)
array.splice(i, 1);
else
j++;
}
}
答案 0 :(得分:1)
//If you sort it .
[{id:10, coords:[{15, 69}, {16, 85}, {16, 34}]},
{id:10, coords:[{15, 69}, {16, 63}]},
{id:20, coords:[{15, 69}, {16, 85}, {16, 34}]},
{id:30, coords:[{15, 69}, {16, 85}, {16, 34}]},
{id:50, coords:[{15, 69}, {16, 85}, {16, 34}]}]
//Loop downwards and check if it's the same id and > coordinates length than previous
// just remove the previous.
let i,j,id;
if(array.length!=0)
{
j=0;
id=array[j].id;
for(i=0;i<array.length;i++)
{
while(id==array[i].id&& i<array.length)
{
if(array[i].cordinates.length< array[j].cordinates.length)
{
array.splice(i, 1);
i--;
}
else
{
array.splice(j, 1);
j=i;
}
i++;
}
j=i;
id=array[j].id;
}
}
}
答案 1 :(得分:1)
您可以使用reduce
根据id
数组的长度来获取每个coords
的唯一项,如下所示:
const input = [{id:10,coords:[[15,69],[16,85],[16,34]]},{id:10,coords:[[15,69],[16,63]]},{id:20,coords:[[15,69],[16,85],[16,34]]},{id:30,coords:[[15,69],[16,85],[16,34]]},{id:50,coords:[[15,69],[16,85],[16,34]]}]
const merged = input.reduce((acc, o) => {
if (!acc[o.id] || o.coords.length > acc[o.id].coords.length)
acc[o.id] = o;
return acc
}, {})
console.log(Object.values(merged))
答案 2 :(得分:0)
您可以通过Array.reduce和一些ES6解构以简洁的方式解决此问题:
const data = [{id:10,coords:[[15,69],[16,85],[16,34]]},{id:10,coords:[[15,69],[16,63]]},{id:20,coords:[[15,69],[16,85],[16,34]]},{id:30,coords:[[15,69],[16,85],[16,34]]},{id:50,coords:[[15,69],[16,85],[16,34]]}]
const result = data.reduce((r, {id, coords}) => {
r[id] = (r[id] || []).length < coords.length ? {id, coords} : r[id]
return r
}, {})
console.log(Object.values(result))
您还可以在一种行变体中以不太可读的方式使用它:
const data = [{id:10,coords:[[15,69],[16,85],[16,34]]},{id:10,coords:[[15,69],[16,63]]},{id:20,coords:[[15,69],[16,85],[16,34]]},{id:30,coords:[[15,69],[16,85],[16,34]]},{id:50,coords:[[15,69],[16,85],[16,34]]}]
const result = data.reduce((r, {id, coords}) =>
(r[id] = (r[id] || []).length < coords.length ? {id, coords} : r[id]) && r, {})
console.log(Object.values(result))