Я запускаю простой ng-repeat
файл JSON и хочу получить имена категорий. Всего около 100 объектов, каждый из которых относится к определенной категории, но их всего около 6 категорий.
Мой текущий код такой:
<select ng-model="orderProp" >
<option ng-repeat="place in places" value="{{place.category}}">{{place.category}}</option>
</select>
На выходе получается 100 разных вариантов, в основном дубликаты. Как мне использовать Angular, чтобы проверить, {{place.category}}
существует ли уже существующий, и не создавать параметр, если он уже существует?
изменить: в моем javascript, $scope.places = JSON data
чтобы уточнить
db.collection.distinct("places")
, что было намного лучше, чем делать это в Angular! К сожалению, это не сработает для всех.Ответы:
Вы можете использовать уникальный фильтр из AngularUI (исходный код доступен здесь: уникальный фильтр AngularUI ) и использовать его непосредственно в ng-options (или ng-repeat).
источник
angular.module('yourModule', ['ui', 'ui.filters']);
. Был в тупике, пока не заглянул внутрь js файла AngularUI.unique
Фильтр в настоящее время можно найти как часть AngularJs UI Utilsangular.module('ui.filters')
имя приложения.Или вы можете написать свой собственный фильтр, используя lodash.
источник
_.uniqBy(arr, field);
должен работать для вложенных свойствВы можете использовать фильтр unique (aliases: uniq) в модуле angular.filter
использование:
colection | uniq: 'property'
вы также можете фильтровать по вложенным свойствам:
colection | uniq: 'property.nested_property'
Вы можете сделать что-то подобное ...
HTML: мы фильтруем по идентификатору клиента, т. Е. Удаляем повторяющихся клиентов.
результат
Список клиентов:
foo 10
bar 20
baz 30
источник
этот код работает у меня.
а потом
источник
Если вы хотите перечислить категории, я думаю, вы должны явно указать свое намерение в представлении.
в контроллере:
источник
group by
выражения вselect
директиве.Вот простой и общий пример.
Фильтр:
Разметка:
источник
Cannot read property 'length' of undefined
в строке выдает ошибку в консолиl = arr.length
Я решил расширить ответ @ thethakuri, чтобы разрешить любую глубину для уникального члена. Вот код Это для тех, кто не хочет включать весь модуль AngularUI только для этой функции. Если вы уже используете AngularUI, проигнорируйте этот ответ:
пример
источник
У меня был массив строк, а не объектов, и я использовал такой подход:
с этим фильтром:
источник
ОБНОВИТЬ
Я рекомендовал использовать Set, но сожалею, что это не работает ни для ng-repeat, ни для Map, поскольку ng-repeat работает только с массивом. Так что проигнорируйте этот ответ. в любом случае, если вам нужно отфильтровать дубликаты одним способом, как сказал другой
angular filters
, вот ссылка на него в раздел «Начало работы» .Старый ответ
Вы можете использовать стандартную структуру данных набора ECMAScript 2015 (ES6) вместо структуры данных массива, таким образом вы фильтруете повторяющиеся значения при добавлении в набор. (Помните, что наборы не допускают повторения значений). Действительно проста в использовании:
источник
Вот способ сделать это только с помощью шаблона (хотя и не поддерживает порядок). Плюс результат тоже будет заказан, что пригодится в большинстве случаев:
источник
Ни один из вышеперечисленных фильтров не устранил мою проблему, поэтому мне пришлось скопировать фильтр из официального документа github. А затем используйте его, как описано в ответах выше.
return function (items, filterOn) {
источник
Кажется, каждый бросает
unique
на ринг свою версию фильтра, так что я сделаю то же самое. Критика очень приветствуется.источник
Если вы хотите получить уникальные данные на основе вложенного ключа:
Назовите это так:
источник
Добавьте этот фильтр:
Обновите разметку:
источник
Это может быть излишним, но для меня это работает.
Отдельная функция зависит от функции contains, определенной выше. Его можно назвать
array.distinct(prop);
где prop - это свойство, которое вы хотите отличить.Так что ты мог просто сказать
$scope.places.distinct("category");
источник
Создайте свой собственный массив.
источник