2015-08-10 2 views
1

В моем приложении Angular у меня есть два массива объектов, которые я показываю. Они оба идентичны типам объектов (Вопросы). Один - это список, а один - набор результатов поиска. В результатах поиска я хочу показать только те результаты, которые еще не указаны в списке. Как отфильтровать результаты поиска любые результаты, которые уже есть в списке.Фильтровать угловой массив, сравнивая его с другим массивом.

В псевдокоде это будет что-то вроде: для каждого члена массива результатов поиска отобразите его только в том случае, если его идентификатор не найден в массиве List.

+0

С какой частью псевдокода вы испытываете трудности? Похоже, вам понадобится 'for', затем' indexOf' (примитив) или вложенный 'for' (объекты). –

+0

Можете ли вы показать код того, что вы пытались? – ajmajmajma

+0

Я новичок в JS и Angular. Это тривиально в Ruby, но я хочу сделать это на front-end и не знаю лучшей практики. Должен ли я использовать ng-if или ng-show и как лучше всего фильтровать результаты поиска. Должен ли я использовать $ filter, и если да, то как? – Finnjon

ответ

1

Вы можете создать пользовательские фильтры в angularJS. Для вашего случая вы можете создать похожий фильтр, как показано ниже.

var secondArrayAsMap = {}; 
secondArray.map(function (elementInSecondArray) { 
    secondArrayAsMap[elementInSecondArray] = elementInSecondArray; 
}) 
return firstArray.filter(function (elementInFirstArray) { 
    return secondArrayAsMap[elementInFirstArray] !== undefined; 
}); 

чем в вашем HTML вы можете получить быстрый доступ к этому фильтру, такие как:

<div ng-repeat=item in filteredItems = (firstArray | yourFilterName:secondArray)>...</div> 
+1

следует упомянуть, когда вы вводите другую библиотечную зависимость – charlietfl

+0

Вы должны упомянуть наивный алгоритм 'O (n * m), который заставит большую часть мобильного телефона отбрасывать кадры. – Ginden

+0

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

0

Это должно перебрать массив сравнения какое-то значение, если значение не как мы добавим его новый массив, который вы можете вернуть и добавить в область $, чтобы показать в своем представлении.

в контроллере

$scope.data_after_search = //your data 
$scope.data = //your data 

$scope.newArray = []; 

for (i = 0; i < data_after_search.length; i++) 
{ 
    if ($scope.data_after_search.name != $scope.data.name) { 
     //some code 
     $scope.newArray += $scope.data_after_search[i]; 
    } 
} 

Это лишь простой пример, но он должен работать. Я использовал .name, потому что я не знал, какие данные у вас есть, но вы, вероятно, должны использовать идентификатор, поскольку, если 2 вещи имеют одинаковый идентификатор, они должны иметь одинаковые данные.

0

Вы можете использовать функцию высокого порядка, и .filter() метод для обработки данных.

Использование функционального подхода - действительно хороший выбор, сделать ваш код более чистым и многоразовым. Таким образом, вы можете создать функцию генератора, и передать его в ваш метод .filter:

var search = [{ 
     id: 1, 
     name:'toto' 
    }, { 
     id: 2, 
     name:'titi' 
    }, { 
     id: 3, 
     name: 'tata' 
    }, { 
     id: 4, 
     name: 'john' 
    }]; 

    var list = [{ 
     id:1, 
     name:'toto' 
    }, { 
     id: 3, 
     name: 'tata' 
    }]; 

    //Create a function generator to filter our array 
    function filterBy(key, filter){ 
    return function(elm){ 
     return filter.indexOf(elm[key]) === -1; 
    } 
    } 

    //Use .filter method, by applying high order function and map the list id 
    var filtered = search.filter(filterBy('id', list.map(function(e){return e.id}))); 

    console.log(filtered); 
0

Не полный ответ, потому что она не распространяется на радиально-конкретный вопрос.

Фактически, вы ищете заданное значение. set operations

Это может быть сделано в O(n+m) времени следующим кодом:

// returns all elements from arr1, that doesn't have matching ID in arr2 
function except(arr1, arr2, propertyName='ID') { 
    let exceptIds = new Set(arr2.map(el=>el[propertyName])); // get set of all IDs in array2 
    return arr1.filter(el=>!exceptIds.has(el[propertyName])); 
} 

Этот код использовать arrow functions и Set экземпляр. Его можно легко реализовать в ES5, используя объект в качестве словаря и используя обычные функции.

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