Поиск по массиву не дает результатов - PullRequest
0 голосов
/ 25 апреля 2018

Я создаю веб-сайт, который будет показывать все общедоступные туалеты в области (это для школьного проекта). Я импортирую файл JSON, анализирую его и называю "ToiletData". Я пытаюсь сделать так, чтобы объект отвечал за определение критериев поиска пользователей. Когда пользователь нажимает «поиск», и объект создается с выбранными критериями, и я пытаюсь перебрать в элементе ToiletData, чтобы удалить все записи, которые не подходят. Проблема в том, что функция не возвращает правильный массив, при поиске определенных критериев функция возвращает только некоторые совпадения, даже если их больше.

Код для поиска объекта (перевод на английский):

function SearchCriteria() {
    this.name = void 0;
    this.address = void 0;
    this.wheelchairAccesible = void 0;
    this.price = void 0;

    this.equals = function() {
        let matches = Object.values(toiletData.entries);

        Object.values(toiletData.entries).forEach(toilet => {
            Object.keys(this).forEach(key => {
                if ((this[key] !== undefined) && (typeof this[key] !== "function")) {
                    if (this[key] !== toilet[key]) {
                        matches.remove(toilet);
                    }
                }
            });
        });
        return matches;
    };
}

В JSON-файле значения, связанные с переменными:

name = string, 
address = string, 
wheelchairAccesible = 1(yes) or 0(no),
price = int

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Поскольку toiletData.entries уже является массивом, вам не нужно использовать Object.values, так как он является избыточным. Кроме того, зачем удалять элемент из копии массива, просто используйте filter, который возвращает массив результатов для вас:

this.equals = function() {
    let searchKeys = Object.keys(this).filter(key =>                       // get a list of available search keys first (for the sake of both clarity and performance)
        this[key] !== undefined && typeof this[key] !== "function"
    );

    return toiletData.entries.filter(toilet =>                             // then for each toilet data entry
        searchKeys.every(key => this[key] == toilet[key])                  // filter only those that match all the search keys values
    );
};

Примечание:

Измените === на == в this[key] == toilet[key], чтобы "0" == 0 было true, так как я считаю, что условия поиска всегда являются строками, а данные в toiletData.entries могут быть числами. Вы также можете создать (лучше) функцию, которая проверяет равенство значений (возможно, строчные буквы, преобразование в числа, ...).

0 голосов
/ 25 апреля 2018

Вместо того, чтобы циклически проходить все свойства this, создайте соответствующие свойства, и пользователь filter и some

var matchProps = ["name", "address", "wheelchairAccesible", "price"];
Object.values(toiletData.entries)
   .filter( toilet => !matchProps
     .some( key => this[key] != toilet[key] ) );
...