从多维数组中删除具有重复ID的项目,并保留标准

时间:2019-05-15 05:35:44

标签: javascript arrays multidimensional-array

我有一个多维的远足径数组,每个远足径都有一个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++;
 }
}

3 个答案:

答案 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))