0

Я пытаюсь реализовать фильтрацию объекта JS Map (массив, проиндексированный идентификатором) вместо обычного массива js в angularJS.AngularJS - фильтрация Javascript Map

Для иллюстрации ниже приведена небольшая модификация примера фильтрации, представленная в AngularJS docs.

http://plnkr.co/edit/bNzePyuAAmP6Nl6hj5bI?p=preview

Я преобразовал входной массив (друзья) на объект JSON с каждым начальным элементом массива отображенного в качестве отдельного элемента шпонки. Эта модификация может быть понята ниже:

начальных (как показан на AngularJS документов):

friends = [{name:'John', phone:'555-1276'}, 
      {name:'Mary', phone:'800-BIG-MARY'}, 
      {name:'Mike', phone:'555-4321'}, 
      {name:'Adam', phone:'555-5678'}, 
      {name:'Julie', phone:'555-8765'}] 

Modified:

friends = {1:{name:'John', phone:'555-1276'}, 
      2:{name:'Mary', phone:'800-BIG-MARY'}, 
      3:{name:'Mike', phone:'555-4321'}, 
      4:{name:'Adam', phone:'555-5678'}, 
      5:{name:'Julie', phone:'555-8765'}} 

Может кто-то обеспечить способ фильтрации такого входа как часть ng-repeat выражение директивного фильтра. Я понимаю, что «друзья» больше не являются массивом, а объектом, но поскольку директива ng-repeat работает над этим объектом, возможно, есть способ его фильтровать?

Спасибо.

+0

Почему вы изменяете оригинал? С ним гораздо проще работать, чем с измененной версией. –

+0

@TravisJ: Я понимаю, что работать с исходной версией проще, учитывая сервис фильтрации. Однако причиной того, что я создаю карту вместо массива, является простота доступа к каждому из объектов. Например, доступ к элементу с именем «Джон» в массиве друзей может быть намного проще на карте, где все, что вам нужно сделать, это сказать друзьям [1]. Мне нужна такая возможность легкого доступа в моем приложении. – Angad

+0

Я не согласен, что легче получить доступ к элементам, когда это карта. Если это массив, вы можете использовать этот точный синтаксис, за исключением того, что он основан на нулевом значении. –

ответ

1

jsFiddle Demo - модифицированная JSON структура

jsFiddle Demo - оригинальная структура JSON

Этот пример может быть очень сильным для небольшого образца, но, как ваш образец становится более сложным, это желание все еще обрабатывают фильтрацию.

Используйте рекурсивную функцию для поиска объекта. Первоначально отправленный мной здесь: https://stackoverflow.com/a/11657379/1026459

function ContainsKeyValue(obj, key, value){ 
if(obj[key] === value) return true; 
for(all in obj) 
{ 
    if(obj[all] != null && obj[all][key] === value){ 
     return true; 
    } 
    if(typeof obj[all] == "object" && obj[all]!= null){ 
     var found = ContainsKeyValue(obj[all], key, value); 
     if(found == true) return true; 
    } 
} 
return false; 
} 

Вы можете использовать эту функцию с модификацией или без исходной структуры у вас.

var friends = {1:{name:'John', phone:'555-1276'}, 
     2:{name:'Mary', phone:'800-BIG-MARY'}, 
     3:{name:'Mike', phone:'555-4321'}, 
     4:{name:'Adam', phone:'555-5678'}, 
     5:{name:'Julie', phone:'555-8765'}}; 

var filteredFriends = []; 
for(var friend in friends) 
{ 
if(ContainsKeyValue(friends[friend], "name", "John") === true) 
{ 
    filteredFriends.push(friends[friend]);//or directly use the john object here 
} 
} 
console.log(filteredFriends);//this will contain an array of friends named John. 
+0

Спасибо, Трэвис. Возможно, я смогу создать настраиваемый фильтр, в котором используются методы, предоставленные вами, и это будет очень хорошо. Хотя я искал что-то менее подробное. Пока что я сделал, чтобы использовать $ scope.friends как «MAP» в качестве моей модели и использовать функцию libs _.values ​​() underscoreJS на этой карте, чтобы связать ее с другой переменной, которая хранит те же данные, что и массив JS. Затем это используется в директиве ng-repeat. Из этого я получаю возможность использовать регулярное поведение фильтра, а также использовать MAP для легкого доступа к моей модели. $ scope гарантирует, что изменения в MAP отразятся в массиве JS. – Angad

Смежные вопросы