2015-04-28 3 views
0

Я пытаюсь фильтровать данные, подобные следующим:Пользовательские угловой фильтр

data = { 
    ABC: "Lorem Ipsum lorem lorem", 
    DEFG: "Lorem Ipsum lorem lorem", 
    HI: "Lorem Ipsum lorem lorem", 
    JK: "Lorem Ipsum lorem lorem" 
} 

против массива, например:

myArray = ["HI","LMN","ABC"] 

Я пытаюсь вернуть пары, для которых ключевым является не присутствует в myArray

Я попытался следующие без успеха:

$scope.filteredResults = $filter("filter")(data, function (val, index) { 
    for (var i = 0; i < myArray.length; i++) { 
    if (index === myArray[i]) { 
     return false 
    } 
    } 
    return true 
}) 
+0

Честно говоря, это просто общий JavaScript 'Array.prototype.filter' вопрос ... –

+0

ли вы угловой фильтр под названием "фильтр"? $ filter - это сервис для получения существующих фильтров, вы определяете новый, используя синтаксис module.filter(). – doldt

+0

Не должен ли 'data' быть массивом? Первый параметр фильтра должен быть «Array» в соответствии с документами. Это верно? –

ответ

1

Если индекс объекта является его ключом, вы можете просто проверить, существует ли он в массиве, используя Array.prototype.indexOf. Я предполагаю, что index является ключом объекта?

$scope.filteredResults = $filter("filter")(data, function(val, index) { 
    return myArray.indexOf(index) === -1; 
}) 

Если вы хотите вернуть отфильтрованный объект, за исключением каких-либо клавиш, которые присутствуют в списке фильтров, можно отфильтровать с помощью клавиш, а затем уменьшить объект на основе разрешенных ключей.

Вот чистая реализация JavaScript для фильтрации объекта с помощью черного списка.

var data = { 
 
    ABC: "Lorem Ipsum lorem lorem", 
 
    DEFG: "Lorem Ipsum lorem lorem", 
 
    HI: "Lorem Ipsum lorem lorem", 
 
    JK: "Lorem Ipsum lorem lorem" 
 
}; 
 
var blackList = ["HI", "LMN", "ABC"]; 
 

 
var filtered = Object.keys(data).filter(function(key) { 
 
    return blackList.indexOf(key) === -1; 
 
}).reduce(function(result, key) { 
 
    result[key] = data[key]; 
 
    return result; 
 
}, {}); 
 

 
document.body.innerHTML = JSON.stringify(filtered, null, ' ');
body { white-space: pre; font-family: monospace; }

+0

Я был настолько увлечен фильтрами углов, что забыл про протофильтр ... Спасибо –

1

Если вы делаете это в controller, почему бы просто не сделать это в простой JavaScript?

FYI: Выполнение этих простых действий в режиме обычного JavaScript будет быстрее, чем в Angular Utilities.

var data = { 
 
    ABC: "Lorem Ipsum lorem lorem", 
 
    DEFG: "Lorem Ipsum lorem lorem", 
 
    HI: "Lorem Ipsum lorem lorem", 
 
    JK: "Lorem Ipsum lorem lorem" 
 
}; 
 

 
var myArray = ["HI", "LMN", "ABC"]; 
 
var keys = Object.keys(data); 
 

 
var result = {}; 
 

 
for (var i = 0; i < keys.length; i++) { 
 
    if (myArray.indexOf(keys[i]) == -1) { 
 
    result[keys[i]] = data[keys[i]]; 
 
    } 
 
} 
 

 
document.body.innerHTML = JSON.stringify(result);

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