Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.03.2022, 18:14
Интересующийся
Отправить личное сообщение для orloff Посмотреть профиль Найти все сообщения от orloff
 
Регистрация: 30.10.2020
Сообщений: 14

Поиск объектов в массиве и их модификация
Всем привет.
Есть такая тема - есть некий массив точек с координатами.
Эти точки выводятся на карте. Но если координаты одинаковые тогда эти маркеры будут друг на друге.
Есть задача одинаковые точки смещать на определенное значение то ли по широте, то ли в пикселях не суть.
В гугл картах этой фичи как я понял нет по умолчанию, посему идея - находить одинаковые точки по широте и долготе и присваивать им коэффициент на который будет множится margin-left.
Например если одинаковых точек будет 3 тогда поле коэфициента будет 1, 2, 3.

Я набросал код который это делает но он какой то монструозный - 2 foreach один внутри другого, filter, find. Вопрос в том, можно ли сделать более компактнее и что бы меньше циклов было?
Вот мой код. (Поиск пока делаю только по широте, но не суть)
const item = [
    {id: 1, name: 'test', address: {lat: 5}},
    {id: 2, name: 'test', address: {lat: 5}},
    {id: 3, name: 'test', address: {lat: 7}},
    {id: 4, name: 'test', address: {lat: 7}},
    {id: 5, name: 'test', address: {lat: 7}},
    {id: 6, name: 'test', address: {lat: 9}},
    {id: 7, name: 'test', address: {lat: 1}},
    {id: 8, name: 'test', address: {lat: 3}},
    {id: 9, name: 'test', address: {lat: 8}},
    {id: 10, name: 'test', address: {lat: 9}},
  ]

find() {
    this.item.forEach((el, i) => { // Перебор всех точек
      if (!el.ratioOffset) { // Если точке еще не присвоен  коэффициент
        const arr = this.item.filter((elem) => elem.address.lat === el.address.lat); // Ищем одинаковые
        arr.forEach((elArr, i) => { // Перебираем найденные точки
          this.item.find((elF) => elF.id === elArr.id)!.ratioOffset = i + 1; // Находим одинаковые точки и присваиваем коэффициент
        })
      }
    });
    console.log(this.item);
  }
find();
Ответить с цитированием
  #2 (permalink)  
Старый 22.03.2022, 18:49
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

orloff,
<script>
const item = [
    {id: 1, name: 'test', address: {lat: 5}},
    {id: 2, name: 'test', address: {lat: 5}},
    {id: 3, name: 'test', address: {lat: 7}},
    {id: 4, name: 'test', address: {lat: 7}},
    {id: 5, name: 'test', address: {lat: 7}},
    {id: 6, name: 'test', address: {lat: 9}},
    {id: 7, name: 'test', address: {lat: 1}},
    {id: 8, name: 'test', address: {lat: 3}},
    {id: 9, name: 'test', address: {lat: 8}},
    {id: 10, name: 'test', address: {lat: 9}},
  ]
let ratioOffset = {};
function find() {
    item.forEach((el, i) => { // Перебор всех точек
     let lat = el.address.lat;
     el.ratioOffset = ratioOffset[lat] = (ratioOffset[lat]|| 0) +1
   });
    console.log(item);
  }
find();
document.write(`<pre>${JSON.stringify(item, "", 1)}</pre>`)
  </script>
Ответить с цитированием
  #3 (permalink)  
Старый 23.03.2022, 10:57
Интересующийся
Отправить личное сообщение для orloff Посмотреть профиль Найти все сообщения от orloff
 
Регистрация: 30.10.2020
Сообщений: 14

рони,
Спасибо огромное, ваш код на много лучше.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Быстрый поиск интервалов в массиве HJ90 Общие вопросы Javascript 19 16.08.2017 23:49
Поиск в массиве объектов desperado Общие вопросы Javascript 1 26.02.2015 12:34
Поиск объектов в массиве Lynatik Общие вопросы Javascript 24 22.06.2013 12:43
Быстрый поиск объектов Shasoft Общие вопросы Javascript 7 30.07.2009 05:28
Поиск в массиве через JavaScript Noran Общие вопросы Javascript 0 10.08.2008 17:31