Удалить элемент с повторяющимся идентификатором из многомерного массива с критерием, который нужно сохранить - PullRequest
0 голосов
/ 15 мая 2019

У меня есть многомерный массив туристических троп, где у каждой тропы есть идентификатор и список координат, например:

[{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}]}]

Я хочу удалить дубликаты, то есть элементы с одинаковым идентификатором, нохранение пункта, где список координат длиннее.

Для меня не проблема удалить элемент с таким же идентификатором, но я не знаю, как определить, какой из элементов сохраняется.Я предполагаю, что это всегда - первый сохраненный предмет.

Вот что я пытался.Я хочу проверить, какая из координат длиннее, а затем оставить эту и удалить другую.

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 ]

1 голос
/ 15 мая 2019

Вы можете использовать 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))
1 голос
/ 15 мая 2019
 //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;
 }
}
}
0 голосов
/ 15 мая 2019

Вы можете решить эту проблему кратко с помощью 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...