Używam Vue, Lodash itp.

{
  "street": {
    "id": "1",
    "streetName": "test",
    "buildings": [
      {
        "id": "1",
        "buildingName": "test"
      }
    ]
  }
}

Mam konfigurację podobną do tego. Jest to pojedynczy obiekt, zasadniczo mam ich tablicę.

Wszystko, co otrzymuję, to wartość building.id.

Od niego muszę być w stanie znaleźć budynek, do którego należy i nie ma żadnej bezpośredniej listy budynków.

Obecnie

Używam zagnieżdżonej pętli do pętli przez każdą stronę, dopóki nie znajdę ten, który ma budynek z tym identyfikatorem. Nie wiem, czy robię to poprawnie, nie jest poprawne.

for(var i = 0; i < streets.length; i++){
    for(var x = 0; x < streets[i].buildings.length;x++){
        if(streets[i].buildings[x].id == '2aec6bed-8cdd-4043-9041-3db4681c6d08'){   

        }
    }
}

Jakieś wskazówki? Dzięki.

0
Anaconda 4 lipiec 2017, 13:17

4 odpowiedzi

Najlepsza odpowiedź

Jeśli próbujesz dostać wszystkie budynki na wszystkich ulicach przez buildingId, rozwiązuje problem:

streetsList.map(streetItem => streetItem.street.buildings.find(building => building.id === searchedBuildingId)).filter(v => v);

.filter(v => v) służy do filtrowania fal falsy, ponieważ chcemy tutaj czysty wynik.

Jeśli na ulicy może być więcej niż jeden budynek z tym samym id, a następnie użyj .some zamiast .find w przykładzie.

0
cнŝdk 4 lipiec 2017, 11:01

Możesz zaginąć street nieruchomość, prawda? Mam na myśli to, że powinno być: streets[i].street.buildings[x].id

-2
watchaglass 4 lipiec 2017, 10:30

Przypuszczalnie masz obiekt ulice , który zawiera obiekty ulicę , jak:

var streets = [
  street :{ ...  },
  street :{ ...  },
  ...
];

Więc musisz wejść na każdą ulicę i iterować nad budynkami. Pętla dla powinna być dość skuteczna, ponieważ może wrócić, gdy tylko znajdzie budynek. Nie sądzę, aby żadne z wbudowanych metod zapętlek zrobi to.

Kod w OP nie działa, ponieważ streets[i].buildings musi być streets[i].streets.buildings i if(streets[i].buildings[x].id musi być if(streets[i].street.buildings[x].id.

Poniżej znajduje się wersja Pętli w wersji , istnieje również wersja przy użyciu ostatnich metod macierzy, które są bardzo wolniejsze nawet na bardzo małym zestawie danych. Według JSPERF, wersja dla Loop Około 100 razy szybsze w Safari, 10 razy szybciej w Firefoksie i 50 razy szybciej w Chrome.

Myślę też, że kod pętli dla jest znacznie bardziej czytelny, a zatem utrzymuje się.

var streets = [{
      "street": {
        "id": "1",
        "streetName": "test",
        "buildings": [{
          "id": "1",
          "buildingName": "test"
        }, {
          "id": "2",
          "buildingName": "test"
        }]
      }
    }, {
      "street": {
        "id": "2",
        "streetName": "test",
        "buildings": [{
          "id": "3",
          "buildingName": "test"
        }]
      }
    }
];

function getBldById(data, id) {
  for (var i=0, iLen=streets.length; i<iLen; i++) {
    var street = streets[i].street;

    for (var j=0, jLen=street.buildings.length; j<jLen; j++) {
      if (street.buildings[j].id == id) {
        return street.buildings[j];
      }    
    }
  }
  return null;
}

console.log(getBldById(streets, '1'));

function getBldById2(data, id) {
  return data.map(streetObj => 
    streetObj.street.buildings.find(building => 
      building.id === id)
    ).filter(v => v)[0];
}

console.log(getBldById2(streets, '1'));
0
RobG 4 lipiec 2017, 11:43

Możesz użyć kombinacji metod filter i some, takich jak:

var result = streets.filter(function(s) {
  return s.street.buildings.some(function(b) {
    return b.id === searchedId;
  });
});
  • Korzystanie z metody .some() powróci true Jeśli building iterowane buildings ma searchedId.
  • Za pomocą .filter() przefiltruje tablicę streets, aby powrócić tylko street obiekt, w którym wywołanie metody some() na jego buildings powróci true, w Inne słowa, które spełniają stan posiadania id równy searchedId.

Demo:

var streets = [{
  "street": {
    "id": "1",
    "streetName": "test",
    "buildings": [{
      "id": "1",
      "buildingName": "test"
    }]
  }
}, {
  "street": {
    "id": "1",
    "streetName": "test",
    "buildings": [{
      "id": '2aec6bed-8cdd-4043-9041-3db4681c6d08',
      "buildingName": "test"
    }]
  }
}];
var searchedId = '2aec6bed-8cdd-4043-9041-3db4681c6d08';

var result = streets.filter(function(s) {
  return s.street.buildings.some(function(b) {
    return b.id === searchedId;
  });
});
console.log(result);
1
cнŝdk 4 lipiec 2017, 10:41