Mam plik JSON zawierający dane, do których chciałbym uzyskać dostęp w mojej witrynie AngularJS. Teraz chcę uzyskać tylko jeden obiekt z tablicy. Więc chciałbym na przykład przedmiot o identyfikatorze 1.
Dane wyglądają następująco:
{ "results": [
{
"id": 1,
"name": "Test"
},
{
"id": 2,
"name": "Beispiel"
},
{
"id": 3,
"name": "Sample"
}
] }
Chciałbym załadować dane za pomocą funkcji AngularJS $ http w następujący sposób:
$http.get("data/SampleData.json");
który działa. Ale jak mogę teraz uzyskać określony obiekt danych (według identyfikatora) z tablicy, z której otrzymuję$http.get
?
Z góry dziękuje za twoją pomoc.
Pozdrawia Marc
Odpowiedzi:
Jedynym sposobem na to jest iteracja po tablicy. Oczywiście, jeśli jesteś pewien, że wyniki są uporządkowane według identyfikatora, możesz przeprowadzić wyszukiwanie binarne
źródło
Korzystanie z rozwiązania ES6
Dla tych, którzy nadal czytają tę odpowiedź, jeśli używasz ES6, plik
find
metoda została dodana w tablicach. Zakładając więc tę samą kolekcję, rozwiązaniem byłoby:Całkowicie wybrałbym teraz to rozwiązanie, ponieważ jest mniej przywiązane do kątowych lub innych ram. Czysty JavaScript.
Rozwiązanie kątowe (stare rozwiązanie)
Chciałem rozwiązać ten problem, wykonując następujące czynności:
Przykład użycia:
Plunker: http://plnkr.co/edit/5E7FYqNNqDuqFBlyDqRh?p=preview
źródło
Dla każdego, kto przegląda ten stary post, jest to obecnie najłatwiejszy sposób. Wymaga tylko AngularJS
$filter
. To jak odpowiedź Willemoesa, ale krótsze i łatwiejsze do zrozumienia.źródło
[0]
zwróciłby pierwszy wynik znaleziony w kolekcji, więc działałby tylko wtedy, gdy twoja kolekcja jest posortowana, a obiekt, którego szukasz, jest pierwszym znalezionym podczas iteracji. Na przykład. jeśli istnieje id: 12, który pojawia się przed id: 2, zwróci id: 12.osobiście używam podkreślenia do tego typu rzeczy ... więc
wtedy „a” będzie żądanym wierszem w tablicy, w którym identyfikator jest równy 2
źródło
find
może potencjalnie zwrócić wiele obiektów. Ponieważ chcemy tylko jednego, możemy użyć,findWhere
który zwraca tylko pierwsze wystąpienie (o którym wiemy, że jest jedynym wystąpieniem), npa = _.findWhere(results, {id: 2})
.Chcę tylko dodać coś do odpowiedzi Willemoesa . Ten sam kod napisany bezpośrednio w kodzie HTML będzie wyglądał następująco:
Zakładając, że „wyniki” to zmienna Twojego FooController i chcesz wyświetlić właściwość „name” przefiltrowanego elementu.
źródło
Możesz używać
ng-repeat
i wybierać dane tylko wtedy, gdy są zgodne z tym, czego szukasz,ng-show
na przykład:źródło
Możesz po prostu zapętlić swoją tablicę:
Jeśli nie chcesz pisać tych niechlujnych pętli, możesz rozważyć użycie underscore.js lub Lo-Dash (przykład w tym drugim):
źródło
Jeśli chcesz wyświetlić listę pozycji, takich jak miasto na podstawie identyfikatora stanu, użyj
źródło
Niestety (o ile się nie mylę), myślę, że musisz powtórzyć obiekt wyników.
Przynajmniej w ten sposób wyjdzie z iteracji, gdy tylko znajdzie prawidłowy pasujący identyfikator.
źródło
Po co komplikować sytuację? to jest proste, napisz jakąś funkcję taką jak ta:
Przypadek użycia:
wynik:
źródło
wyjście: Azərbaycan
źródło
Jeśli możesz, zaprojektuj strukturę danych JSON, używając indeksów tablic jako identyfikatorów. Możesz nawet "znormalizować" swoje tablice JSON, o ile nie masz problemu z używaniem indeksów tablic jako "klucza podstawowego" i "klucza obcego", coś w rodzaju RDBMS. W związku z tym w przyszłości możesz nawet zrobić coś takiego:
To jest rozwiązanie „By Design” . W Twoim przypadku po prostu:
Oczywiście, jeśli format Twojego identyfikatora jest taki jak „XX-0001”, którego indeks tablicy wynosi 0 , możesz albo wykonać operacje na łańcuchach, aby zmapować identyfikator; w przeciwnym razie nic nie można na to poradzić, z wyjątkiem podejścia iteracyjnego.
źródło
Wiem, że jestem za późno na odpowiedź, ale zawsze lepiej jest się pojawić niż w ogóle się nie pojawiać :). ES6 sposób, aby to zdobyć:
źródło
Prosty sposób na pobranie (jednego) elementu z tablicy przez id:
Metoda find () zwraca wartość pierwszego elementu tablicy, który spełnia podaną funkcję testującą. W przeciwnym razie zwracany jest undefined.
nie musisz używać filter () i łapać pierwszego elementu xx.filter () [0] jak w komentarzach powyżej
To samo dotyczy obiektów w tablicy
Oczywiście, jeśli masz wiele identyfikatorów, użyj metody filter (), aby pobrać wszystkie obiekty. Twoje zdrowie
źródło
Nie jestem pewien, czy to naprawdę dobre, ale to było dla mnie pomocne. Musiałem użyć $ scope, aby działał poprawnie.
źródło
użyj $ timeout i uruchom funkcję do wyszukiwania w tablicy wyników
źródło
Iterowałbym po tablicy wyników za pomocą filtru angularjs w następujący sposób:
var foundResultObject = getObjectFromResultsList (wyniki, 1);
źródło