Есть ли лучший способ искать атрибуты в массиве массивов? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть функция с оператором switch, которая ищет единственный случай и, если не находит его, запускает default, который является другим оператором switch. Он в основном выполняет поиск по всему моему массиву. Я уверен, что есть лучший способ сделать это. Я новичок в javascript и не знаю. Вот фрагмент:

for(var i=0; i < parks.length; i++) {
    switch (parks[i][6]) {            
        case 'wc' : 
            wc.push(L.marker([parks[i][1], parks[i][2]], {icon: parks[i][4]}).bindpopup("<a href='" + parks[i][3] + "'>" + parks[i][0] + "</a>"));
            break;        
        default :
            switch (parks[i][7]) {            
         case 'grill' : 
            grill.push(L.marker([parks[i][1], parks[i][2]], {icon: parks[i][4]}).bindpopup("<a href='" + parks[i][3] + "'>" + parks[i][0] + "</a>"));
            break;        
         default :
            break;
            break;
    }
}

Пример моего массива парков, потому что все спрашивают:

var parks = [
['Spårvagnsparken',59.3298868,18.0031605,'http://leksplay.com/sparvagnsparken', greenIcon, wc, grill, null, null, fence, null, null, null, null],
['Fredhällsparkens plaskdamm',  59.3320485,18.0029481, 'http://leksplay.com/fredhallsparkensplaskdamm', greenIcon, wc, null, null, null, null, null, null, water, null],
['Uggleparken',     59.3343715,18.0040208,'http://leksply.com/uggleparken', greenIcon, wc, null, null, null, null, pfence, null, null, null],
['Observatorielundens Parklek', 59.3413877,18.056007, 'http://leksplay.com/observatorielundensparklek', greenIcon, wc, null, null, null, null, pfence, null, null, toddler],

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Учитывая ваш предоставленный массив, я бы

  • Это bindPopup, а не bindpopup
  • построил markers как Object {}
  • Получить все (не NULL) POI "props" (например, "toddler", "wc" et c)
  • Итерировать извлечены реквизиты, вставив newMarker() в markers объект.
const markers = {};
const newMarker = poi => L.marker([poi.lat, poi.lng], {icon: poi.icon})
                       .bindPopup(`<a href="${poi.url}">${poi.name}</a>`);

const parks = [
  ['Spårvagnsparken', 59.3298868, 18.0031605, 'http://leksplay.com/sparvagnsparken', "greenIcon", "wc", "grill", null, null, "pfence", null, null, null, null],
  ['Fredhällsparkens plaskdamm', 59.3320485, 18.0029481, 'http://leksplay.com/fredhallsparkensplaskdamm', "greenIcon", "wc", null, null, null, null, null, null, "water", null],
  ['Uggleparken', 59.3343715, 18.0040208, 'http://leksply.com/uggleparken', "greenIcon", "wc", null, null, null, null, "pfence", null, null, null],
  ['Observatorielundens Parklek', 59.3413877, 18.056007, 'http://leksplay.com/observatorielundensparklek', "greenIcon", "wc", null, null, null, null, "pfence", null, null, "toddler"],
];

parks.forEach(([name, lat, lng, url, icon, ...props]) => {
  props.filter(Boolean).forEach(prop => {
     if (!(prop in markers)) markers[prop] = []; // Prepare if not exists
     markers[prop].push(newMarker({name, lat, lng, url, icon}));
  });
})

console.log(markers);

Пример (только с объектами, для демонстрации):

const markers = {};
const newMarker = poi => poi;

const parks = [
  ['Spårvagnsparken', 59.3298868, 18.0031605, 'http://leksplay.com/sparvagnsparken', "greenIcon", "wc", "grill", null, null, "pfence", null, null, null, null],
  ['Fredhällsparkens plaskdamm', 59.3320485, 18.0029481, 'http://leksplay.com/fredhallsparkensplaskdamm', "greenIcon", "wc", null, null, null, null, null, null, "water", null],
  ['Uggleparken', 59.3343715, 18.0040208, 'http://leksply.com/uggleparken', "greenIcon", "wc", null, null, null, null, "pfence", null, null, null],
  ['Observatorielundens Parklek', 59.3413877, 18.056007, 'http://leksplay.com/observatorielundensparklek', "greenIcon", "wc", null, null, null, null, "pfence", null, null, "toddler"],
];

parks.forEach(([name, lat, lng, url, icon, ...props]) => {
  props.filter(Boolean).forEach(prop => {
     if (!(prop in markers)) markers[prop] = []; // Prepare if not exists
     markers[prop].push(newMarker({name, lat, lng, url, icon}));
  });
})

console.log(markers);
0 голосов
/ 26 мая 2020

Создайте функцию, которая вызывает и возвращает L.marker, передавая ей массив на каждой итерации при выполнении условия. Просто используйте ===, чтобы проверить, является ли элемент в индексе wc или grill:

const makeMarker = park => L.marker([park[1], park[2]], { icon: park[4] })
  .bindpopup("<a href='" + park[3] + "'>" + park[0] + "</a>");
for (const park of parks) {
  if (park[6] === 'wc') {
    wc.push(makeMarker(park));
  } else if (park[7] === 'grill') {
    grill.push(makeMarker(park));
  }
}

В идеале исправьте структуру ввода, чтобы вместо разных значений в позициях [6], [7], et c, вместо этого у вас есть один массив значений, затем проверьте массив на наличие различных значений и добавьте маркер к объекту массивов:

const categories = ['wc', 'grill', /* ... */];
const markers = Object.fromEntries(
  categories.map(cat => [cat, []])
);
for (const park of parks) {
  const marker = makeMarker(park);
  const cat = categories.find(cat => park[6].includes(cat));
  markers[cat].push(marker);
}
...