Как вернуть логические значения, объединенные с && внутри функции обратного вызова в методе фильтра? - PullRequest
1 голос
/ 28 марта 2019

Я ищу элегантный способ создания логических значений, которые в конечном итоге будут объединены с использованием оператора && внутри моей функции обратного вызова в методе фильтра.

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

return Boolean && Boolean && Boolean && Boolean && Boolean

Becasue + = && Boolean не работает.

Вот что у меня есть и что работает:

//data I am filtering
this.preSearch = [
  ["The Lord of the Rings", "J. R. R. Tolkien", "English", "1955", "150 milionów"],
  ["Le Petit Prince (The Little Prince)", "Antoine de Saint-Exupéry", "French", "1943", "140 milionów"],
  ["Harry Potter and the Philosopher's Stone", "J. K. Rowling", "English",  "1997", "120 milionów"],
  ["The Hobbit", "J. R. R. Tolkien", "English", "1937", "100 milionów"],
  ["And Then There Were None", "Agatha Christie",   "English", "1939",  "100 milionów"],
  ["Dream of the Red Chamber",  "Cao Xueqin",   "Chinese", "1791", "100 milionów"]
]

//filters, that are set dynamically but let's pretend they are equal to
var filters = ["", "", "english", "19", "1"]

var searchdata = this.preSearch.filter(row => {
          return 
    row[0].toLowerCase().indexOf(filters[0].toLowerCase()) > -1 
    && row[1].toLowerCase().indexOf(filters[1].toLowerCase()) > -1 
    && row[2].toLowerCase().indexOf(filters[2].toLowerCase()) > -1 
    && row[3].toLowerCase().indexOf(filters[3].toLowerCase()) > -1 
    && row[4].toLowerCase().indexOf(filters[4].toLowerCase()) > -1
})

Мне нужно масштабируемое и более элегантное решение, поэтому мне не придется добавлять еще одну строку с &&, если я улучшу свой фильтрованный массив.

Ответы [ 2 ]

4 голосов
/ 28 марта 2019

Вы можете использовать Array#every для массива фильтров.

Для более быстрой проверки вы можете заранее преобразовать значения фильтра в нижний регистр.

var preSearch = [["The Lord of the Rings", "J. R. R. Tolkien", "English", "1955", "150 milionów"], ["Le Petit Prince (The Little Prince)", "Antoine de Saint-Exupéry", "French", "1943", "140 milionów"], ["Harry Potter and the Philosopher's Stone", "J. K. Rowling", "English", "1997", "120 milionów"], ["The Hobbit", "J. R. R. Tolkien", "English", "1937", "100 milionów"], ["And Then There Were None", "Agatha Christie", "English", "1939", "100 milionów"], ["Dream of the Red Chamber", "Cao Xueqin", "Chinese", "1791", "100 milionów"]],
    filters = ["", "", "english", "19", "1"].map(s => s.toLowerCase()),
    result = preSearch
        .filter(row => filters.every((v, i) => row[i].toLowerCase().includes(v)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 28 марта 2019

Вы можете сделать это, применив Array.every() и String.includes() следующим образом:

var searchdata = this.preSearch.filter(row => {

    // this only returns true if our condition works for
    // index = 0, 1, 2, 3, 4
    return [0, 1, 2, 3, 4].every(index => {
        const rowContent = row[index].toLowerCase();
        const filterContent = filters[index].toLowerCase();

        // String.includes() is nicer than String.indexOf() here because
        // you don't need the ugly -1
        return rowContent.includes(filterContent);
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...