Я использую мой ruleOut
функция для фильтрации объектов на основе [1 120] определенные нежелательные значения свойств. я понимаю, что в Вашем примере требуется использовать условия вместо значений, но мой ответ действителен для заголовка вопроса, таким образом, я хотел бы оставить свой метод здесь.
function ruleOut(arr, filterObj, applyAllFilters=true) {
return arr.filter( row => {
for (var field in filterObj) {
var val = row[field];
if (val) {
if (applyAllFilters && filterObj[field].indexOf(val) > -1) return false;
else if (!applyAllFilters) {
return filterObj[field].filter(function(filterValue){
return (val.indexOf(filterValue)>-1);
}).length == 0;
}
}
}
return true;
});
}
Говорят, что у Вас есть список агентов как это:
let actors = [
{userName:"Mary", job:"star", language:"Turkish"},
{userName:"John", job:"actor", language:"Turkish"},
{userName:"Takis", job:"star", language:"Greek"},
{userName:"Joe", job:"star", language:"Turkish"},
{userName:"Bill", job:"star", language:"Turkish"}
];
и требуется найти всех агентов, которые оцениваются как звезды Холивуда, их национальность не должна быть одним из 'англичан', 'итальянца', 'испанцев', 'грек', плюс их имя не был бы одной из 'Mary', 'Joe'. Пример Bizzar, я знаю! Так или иначе с тем набором условий Вы создали бы следующий объект:
let unwantedFieldsFilter= {
userName: ['Mary', 'Joe'],
job: ['actor'],
language: ['English', 'Italian', 'Spanish', 'Greek']
};
хорошо, теперь если Вы ruleOut(actors, unwantedFieldsFilter)
Вы только добрались бы
[{имя пользователя: "Счет", задание: "звезда", язык: "Турецкий язык"}]
И счет является Вашим человеком, с тех пор его зовут не одна из 'Mary', 'Joe', его национальность не включена в ['английский', 'итальянский', 'испанский', 'греческий язык'] плюс, он - Звезда!
в моем методе существует одна опция, который является applyAllFilters
и верен по умолчанию. Если бы Вы попробовали бы к ruleOut этим набором параметрического усилителя как ложь, которая работала бы 'ИЛИ' фильтрующий вместо 'И'. Пример: ruleOut(actors, {job:["actor"], language:["Italian"]}, false)
получил бы Вас все, которые не являются агентом или итальянским языком:
[{имя пользователя: "Mary", задание: "звезда", язык: "Турецкий язык"},
{имя пользователя: "Takis", задание: "звезда", язык: "Греческий язык"},
{имя пользователя: "Joe", задание: "звезда", язык: "Турецкий язык"},
{имя пользователя: "Счет", задание: "звезда", язык: "Турецкий язык"}]
Да. Цикл foreach будет перебирать список в порядке, указанном методом iterator ()
. См. Документацию для интерфейса Iterable .
Если вы посмотрите Javadoc for List , вы увидите, что список является «упорядоченной коллекцией» и что итератор ()
метод возвращает итератор, который выполняет итерацию «в правильной последовательности».
Да, спецификации языка Java гарантируют, что
for (Iterator<Whatever> i = c.iterator(); i.hasNext(); )
whatEver(i.next());
эквивалентен
for (Whatever x : c)
whatEver(x);
, никакое «изменение порядка» не допускается.
Вы можете использовать цикл for, например, for (int i = 0; i
Цикл foreach
будет использовать итератор, встроенный в коллекцию
, поэтому порядок получения результатов будет зависеть от того, будет ли Коллекция
поддерживает некоторый порядок элементов.
Итак, если вы перебираете ArrayList
, вы получите элементы в том порядке, в котором они были вставлены (при условии, что вы не продолжили сортировку ArrayList). Если вы перебираете HashSet
, все ставки отключены, поскольку HashSets не поддерживает какой-либо порядок.
Если вам нужно гарантировать порядок элементов в Коллекции, определите Компаратор
, который устанавливает этот порядок и использует Collections.sort (Collection
.