Как преобразовать и отфильтровать массив - PullRequest
0 голосов
/ 21 мая 2018

У меня есть 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
    }
  ]
]

Ответы [ 6 ]

0 голосов
/ 21 мая 2018

Вы можете использовать составной ключ для хеш-таблицы, чтобы ускорить поиск дубликатов:

 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}]);
   }
 }
0 голосов
/ 21 мая 2018

Я бы посоветовал вам добавить поле счетчика в 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);
0 голосов
/ 21 мая 2018

Это решение для фильтрации: сначала вы сокращаете данные в группы, а затем присоединяетесь к строке.

    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));
    
0 голосов
/ 21 мая 2018

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);
0 голосов
/ 21 мая 2018

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

Для справки: Array.reduce и Object.values ​​

0 голосов
/ 21 мая 2018

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