@faleaksey

Как сравнить значения select?

Всем привет! Имеется следующий код:
class Filter {
    constructor() {
        this.param = this.parsUrl();
    }

    parsUrl() {
        const qd = {};

        const testUrl = '?size=L&color=1,3&manufacturer=aaa,eee';
        if (testUrl) testUrl.substr(1).split("&").forEach(function (item) {
            let s = item.split("="),
                k = s[0],
                v = s[1] && decodeURIComponent(s[1]);
            (qd[k] = qd[k] || []).push(v.split(','))
        });
        return qd;
    }

    filterInit() {

        for (let key in this.param) {

            const elValue = this.param[key][0];
            let el = document.getElementsByName(key);

            el.forEach(function (el) {
             
                switch (el.type) {
                    case 'checkbox':
                        for (let i = 0; i < elValue.length; i++) {
                            if (elValue[i].toLowerCase() === el.value.toLowerCase()) {
                                el.checked = true;
                            }
                        }
                        break;
                    case 'radio':
                        for (let i = 0; i < elValue.length; i++) {
                            if (elValue[i].toLowerCase() === el.value.toLowerCase()) {
                                el.checked = true;
                            }
                        }
                        break;
                    case 'select-multiple':
                    console.log(el.children);
                        for (let i = 0; i < elValue.length; i++) {
                            console.log(el.children[i].value);
                            console.log(el.children[i].value === elValue[i]);
                            // if (el.children[i].value === elValue[i]) {
                            //     console.log(el.children[i].value === elValue[i]);
                            // }
                        }
                        break;

                }
            });
        }
    }
}

let filter = new Filter();

filter.filterInit();


в данном контексте не получается сравнить значения select, в конструкции switch case:
switch (el.type) {
                    case 'checkbox':
                        for (let i = 0; i < elValue.length; i++) {
                            if (elValue[i].toLowerCase() === el.value.toLowerCase()) {
                                el.checked = true;
                            }
                        }
                        break;
                    case 'radio':
                        for (let i = 0; i < elValue.length; i++) {
                            if (elValue[i].toLowerCase() === el.value.toLowerCase()) {
                                el.checked = true;
                            }
                        }
                        break;
                    case 'select-multiple':
                    console.log(el.children);
                        for (let i = 0; i < elValue.length; i++) {
                            console.log(el.children[i].value);
                            console.log(el.children[i].value === elValue[i]);
                            // if (el.children[i].value === elValue[i]) {
                            //     console.log(el.children[i].value === elValue[i]);
                            // }
                        }
                        break;

                }

что не так?

https://jsfiddle.net/sdL2zq8h/
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Судя по показанному коду, вы почему-то решили, что элемент массива и option, имеющие одинаковые значения, будут находится на одинаковых же позициях. Это абсурд. Сравнивать надо каждый с каждым, то есть, так или иначе, циклов должно быть два (в явном виде, конечно, ни одного, слишком всё у вас многословно):

case 'select-multiple':
  [...el.children].forEach(n => n.selected = elValue.includes(n.value));
  break;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы