У меня есть файл JSON, содержащий некоторые данные, к которым я хотел бы получить доступ на моем веб-сайте AngularJS. Теперь я хочу получить только один объект из массива. Так что я бы хотел, например, Item с id 1.
Данные выглядят так:
{ "results": [
{
"id": 1,
"name": "Test"
},
{
"id": 2,
"name": "Beispiel"
},
{
"id": 3,
"name": "Sample"
}
] }
Я хотел бы загрузить данные с помощью функции AngularJS $ http следующим образом:
$http.get("data/SampleData.json");
который работает. Но как мне теперь получить конкретный объект данных (по идентификатору) из массива, из которого я получаю $http.get
?
Заранее спасибо за вашу помощь.
Приветствует Марка
Ответы:
Единственный способ сделать это - перебрать массив. Очевидно, если вы уверены, что результаты упорядочены по идентификатору, вы можете выполнить двоичный поиск
источник
Использование решения ES6
Для тех, кто все еще читает этот ответ, если вы используете ES6,
find
метод был добавлен в массивы. Итак, предполагая ту же коллекцию, решение будет:Я бы полностью выбрал это решение сейчас, поскольку оно менее привязано к angular или любой другой структуре. Чистый Javascript.
Угловое решение (старое решение)
Я стремился решить эту проблему, выполнив следующие действия:
Пример использования:
Plunker: http://plnkr.co/edit/5E7FYqNNqDuqFBlyDqRh?p=preview
источник
Для всех, кто просматривает этот старый пост, это самый простой способ сделать это на данный момент. Для этого требуется только AngularJS
$filter
. Это похоже на ответ Виллемоса, но короче и легче для понимания.источник
[0]
приведет к тому, что он вернет первый результат, который он найдет в коллекции, поэтому он будет работать только в том случае, если ваша коллекция отсортирована, а объект, который вы ищете, будет первым, который он найдет во время своей итерации. Например. если перед id: 2 стоит id: 12, он вернет id: 12.лично я использую подчеркивание для такого рода вещей ... так что
тогда "a" будет той строкой, которую вы хотели в своем массиве, где идентификатор был равен 2
источник
find
потенциально может возвращать несколько объектов. Поскольку нам нужен только один, мы можем использовать,findWhere
который возвращает только первое вхождение (которое, как мы знаем, является единственным вхождением), напримерa = _.findWhere(results, {id: 2})
.Я просто хочу добавить кое-что к ответу Виллемоса . Тот же код, написанный непосредственно внутри HTML, будет выглядеть так:
Предполагая, что «результаты» - это переменная вашего FooController, и вы хотите отобразить свойство «имя» фильтруемого элемента.
источник
Вы можете использовать
ng-repeat
и выбирать данные только в том случае, если данные соответствуют тому, что вы ищете,ng-show
например:источник
Вы можете просто перебрать свой массив:
Если вы не хотите писать эти беспорядочные циклы, вы можете рассмотреть возможность использования underscore.js или Lo-Dash (пример последнего):
источник
Если вам нужен список элементов, таких как город, на основе идентификатора состояния, используйте
источник
К сожалению (если я не ошибаюсь), я думаю, вам нужно перебрать объект результатов.
По крайней мере, таким образом он выйдет из итерации, как только найдет правильный соответствующий идентификатор.
источник
Зачем усложнять ситуацию? это просто напишите какую-нибудь функцию вроде этой:
Пример использования:
вывод:
источник
вывод: Azərbaycan
источник
По возможности спроектируйте структуру данных JSON, используя индексы массива в качестве идентификаторов. Вы даже можете «нормализовать» свои массивы JSON, если у вас нет проблем с использованием индексов массива в качестве «первичного ключа» и «внешнего ключа», что-то вроде РСУБД. Таким образом, в будущем вы даже можете сделать что-то вроде этого:
Это решение «By Design» . В вашем случае просто:
Конечно, если ваш формат идентификатора похож на «XX-0001», индекс массива которого равен 0 , тогда вы можете либо выполнить некоторые операции со строкой, чтобы сопоставить идентификатор; иначе с этим ничего нельзя поделать, кроме итерационного подхода.
источник
Я знаю, что слишком поздно отвечать, но всегда лучше появиться, чем не появляться вообще :). ES6 способ получить это:
источник
Простой способ получить (один) элемент из массива по id:
Метод find () возвращает значение первого элемента в массиве, который удовлетворяет предоставленной функции тестирования. В противном случае возвращается undefined.
вам не нужно использовать filter () и ловить первый элемент xx.filter () [0], как в комментариях выше
То же самое для объектов в массиве
Конечно, если у вас несколько идентификаторов, используйте метод filter (), чтобы получить все объекты. ура
источник
Не уверен, что это действительно хорошо, но это было полезно для меня ... Мне нужно было использовать $ scope, чтобы он работал правильно.
источник
используйте $ timeout и запустите функцию для поиска в массиве "результатов"
источник
Я бы перебирал массив результатов, используя фильтр angularjs следующим образом:
var foundResultObject = getObjectFromResultsList (результаты, 1);
источник