Поиск объектов в массиве и их модификация
Всем привет.
Есть такая тема - есть некий массив точек с координатами. Эти точки выводятся на карте. Но если координаты одинаковые тогда эти маркеры будут друг на друге. Есть задача одинаковые точки смещать на определенное значение то ли по широте, то ли в пикселях не суть. В гугл картах этой фичи как я понял нет по умолчанию, посему идея - находить одинаковые точки по широте и долготе и присваивать им коэффициент на который будет множится 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(); |
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> |
рони,
Спасибо огромное, ваш код на много лучше. |
Часовой пояс GMT +3, время: 09:55. |