Задать вопрос
paulfcdd
@paulfcdd
PHP/Sf/WEB developer

Как проверить, есть ли объект в массиве?

Есть три объекта с координатами:

1) {lat: 52.289591, lng: 21.030541}
2) {lat: 52.289591, lng: 21.030541}
3) {lat: 51.09464, lng: 17.019549}

и есть также массив markersArray, который нужно заполнить этими объектами, но без дубликатов, то есть, чтобы по итогу итерации массив содержал в себе только 2 элемента:

0: {lat: 52.289591, lng: 21.030541}
1: {lat: 51.09464, lng: 17.019549}

Как проверить, присутствует ли данный объект в массиве и если да, то не пушить его в массив?
  • Вопрос задан
  • 1233 просмотра
Подписаться 3 Средний Комментировать
Решения вопроса 4
0xD34F
@0xD34F Куратор тега JavaScript
const result = arr.filter((n, i, a) => n === a.find(m => m.lat === n.lat && m.lng === n.lng));

или

const result = Object.values(arr.reduce((acc, n) => (acc[`${n.lat},${n.lng}`] = n, acc), {}));

или

const result = [].concat(...Object
  .values(arr.reduce((acc, n) => ((acc[n.lat] = acc[n.lat] || {})[n.lng] = n, acc), {}))
  .map(Object.values)
);

или

const result = Array.from(new Set(arr.map(JSON.stringify)), JSON.parse);

или

const unique = (arr, keys) =>
  arr.filter((n, i, a) => i === a.findIndex(m => keys.every(k => n[k] === m[k])));


const result = unique(arr, [ 'lat', 'lng' ]);
Ответ написан
@ned4ded
Верстка, Фронтенд
const arr = [
  {lat: 52.289591, lng: 21.030541},
  {lat: 52.289591, lng: 21.030541},
  {lat: 51.09464, lng: 17.019549},
];

const uniq = arr.filter(
  (el, i, array) => !array
    .slice(0, i)
    .find(({lat, lng}) => lat === el.lat && lng === el.lng)
);


https://repl.it/@ned4ded/ElementaryVeneratedTelevision
Ответ написан
Комментировать
coderisimo
@coderisimo Куратор тега JavaScript
мне кажется тут задачка в 3 строчки)))

function addNew(arr, newObj) {
  if (!($.grep(arr, function(n, i) { return n.lat == newObj.lat && n.lng == newObj.lng; })).length)
   arr.push(newObj);
}
Ответ написан
Комментировать
@deliro
Чёт какие-то нефункциональные, некрасивые и негибкие у вас подходы, господа)

1. Грузишь lodash (кому очень жалко килобайты — из него можно использовать только нужные функции)
2. _.uniqWith(x, _.isEqual); где x — массив твоих объектов с координатами

https://codepen.io/anon/pen/yEJQXM
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы