亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

選中多個復選框時篩選數據

選中多個復選框時篩選數據

寶慕林4294392 2022-09-23 16:32:30
目前,在我的應用程序中,用戶可以通過鍵入游戲名稱來搜索游戲標題。當他們開始鍵入結果時,將使用篩選器方法進行更新。我現在嘗試使用多個復選框執行相同的操作。因此,當用戶檢查游戲機和/或Xbox時,例如結果僅顯示這些類別中的游戲。當他們取消選中時,結果將使用更新的值刷新。目前,我已成功為所有復選框創建了更改事件,并將其值推送到 filters.categories 數組。我遇到的問題是我不知道如何將此數組連接到我現有的過濾器方法。我需要以某種方式循環遍歷數組,并將當前值與我的存儲對象中的 category.name 進行比較,以查看它們是否匹配。這在過濾方法內部可以做到嗎?有什么想法我錯了嗎?提前致謝。網頁:<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title></head><body>    <aside>        <ul>            <li>                <label>                    <input type="checkbox" value="playstation" class="category-cb">                    <span>Playstation</span>                </label>                <li>                    <label>                        <input type="checkbox" value="xbox" class="category-cb">                        <span>Xbox</span>                    </label>                </li>                <li>                    <label>                        <input type="checkbox" value="nintendo" class="category-cb">                        <span>Nintendo</span>                    </label>                </li>            </li>        </ul>    </aside>    <main>        <input type="text" class="store-search" placeholder="Search">        <ul class="grid"></ul>    </main>    <script src="app.js"></script></body></html>這些:/*----------------------------    data----------------------------*/const stores = [{    id: 0,    name: 'The Last Of Us',    studio: 'Naughtydog',    thumbnail: '',    category: {        id: 0,        name: 'Playstation'    },    price: 50.00}, {    id: 1,    name: 'Animal Crossing',    studio: 'Nintendo',    thumbnail: '',    category: {        id: 1,        name: 'Nintendo'    },    price: 60.00}, {    id: 2,    name: 'Gears 5',    studio: 'The Coalition',    thumbnail: '',    category: {        id: 2,        name: 'Xbox'    },https://jsfiddle.net/bjgp0ux4/
查看完整描述

1 回答

?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

要實現兩個主要功能:


取消選中類別時將其刪除


我建議您使用 Set as ,以便您可以分別通過 和 輕松檢查、添加和刪除條目。filters.categorieshasadddelete


//onchange event

if (checkbox.checked) {

    filters.categories.add(event.target.value);

} else {

    filters.categories.delete(event.target.value);

}

filterStores(stores, filters);

也根據類別進行過濾stores


將回調修改為帳戶:.filter


store.name.toLowerCase().includes(filters.searchText.toLowerCase()) &&

filters.categories.has(store.category.name.toLowerCase())

此外,要在未選擇任何類別時顯示全部,請執行以下操作:


store.name.toLowerCase().includes(filters.searchText.toLowerCase()) &&

(

    filters.categories.has(store.category.name.toLowerCase()) ||

    filters.categories.size === 0

)

一起:


/*----------------------------

    data

----------------------------*/


const stores = [{

    id: 0,

    name: 'The Last Of Us',

    studio: 'Naughtydog',

    thumbnail: '',

    category: {

        id: 0,

        name: 'Playstation'

    },

    price: 50.00

}, {

    id: 1,

    name: 'Animal Crossing',

    studio: 'Nintendo',

    thumbnail: '',

    category: {

        id: 1,

        name: 'Nintendo'

    },

    price: 60.00

}, {

    id: 2,

    name: 'Gears 5',

    studio: 'The Coalition',

    thumbnail: '',

    category: {

        id: 2,

        name: 'Xbox'

    },

    price: 10.00

}, {

    id: 3,

    name: 'DOOM Eternal',

    studio: 'id Software',

    thumbnail: '',

    category: {

        id: 3,

        name: 'Playstation'

    },

    price: 50.00

}, {

    id: 4,

    name: 'The Legend of Zelda: Link\'s Awakening',

    studio: 'Grezzo',

    thumbnail: '',

    category: {

        id: 4,

        name: 'Nintendo'

    },

    price: 35.00

}, {

    id: 5,

    name: 'Resident Evil 3',

    studio: 'Capcom',

    thumbnail: '',

    category: {

        id: 5,

        name: 'Playstation'

    },

    price: 40.00

}];


let filters = {

    searchText: '',

    categories: new Set

}


/*----------------------------

    functions

----------------------------*/


let filterStores = function (stores, filters) {


    let filteredStores = stores.filter(store => (

        store.name.toLowerCase().includes(filters.searchText.toLowerCase()) &&

        (

            filters.categories.has(store.category.name.toLowerCase()) ||

            filters.categories.size === 0 //No selected categories, show all

        )

    ));


    let grid = document.querySelector('.grid');

    grid.innerHTML = '';


    filteredStores.forEach(function (store) {

        let li = document.createElement('li');

        li.textContent = store.name;

        grid.appendChild(li);

    });

}


/*----------------------------

    events

----------------------------*/


document.addEventListener('DOMContentLoaded', function () {

    filterStores(stores, filters);


    document.querySelector('.store-search').addEventListener('input', function (event) {

        filters.searchText = event.target.value;

        filterStores(stores, filters);

    });


    document.querySelectorAll('.category-cb').forEach(function (checkbox) {

        checkbox.addEventListener('change', function (event) {

            if (checkbox.checked) {

                filters.categories.add(event.target.value);

            } else {

                filters.categories.delete(event.target.value);

            }

            filterStores(stores, filters);

        });

    });

});

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

</head>

<body>


    <aside>

        <ul>

            <li>

                <label>

                    <input type="checkbox" value="playstation" class="category-cb">

                    <span>Playstation</span>

                </label>

            </li>

            <li>

                <label>

                    <input type="checkbox" value="xbox" class="category-cb">

                    <span>Xbox</span>

                </label>

            </li>

            <li>

                <label>

                    <input type="checkbox" value="nintendo" class="category-cb">

                    <span>Nintendo</span>

                </label>

            </li>

        </ul>

    </aside>

    <main>

        <input type="text" class="store-search" placeholder="Search">

        <ul class="grid"></ul>

    </main>


    <script src="app.js"></script>

</body>

</html>


您還可以使用數組:


/*----------------------------

    data

----------------------------*/


const stores = [{

    id: 0,

    name: 'The Last Of Us',

    studio: 'Naughtydog',

    thumbnail: '',

    category: {

        id: 0,

        name: 'Playstation'

    },

    price: 50.00

}, {

    id: 1,

    name: 'Animal Crossing',

    studio: 'Nintendo',

    thumbnail: '',

    category: {

        id: 1,

        name: 'Nintendo'

    },

    price: 60.00

}, {

    id: 2,

    name: 'Gears 5',

    studio: 'The Coalition',

    thumbnail: '',

    category: {

        id: 2,

        name: 'Xbox'

    },

    price: 10.00

}, {

    id: 3,

    name: 'DOOM Eternal',

    studio: 'id Software',

    thumbnail: '',

    category: {

        id: 3,

        name: 'Playstation'

    },

    price: 50.00

}, {

    id: 4,

    name: 'The Legend of Zelda: Link\'s Awakening',

    studio: 'Grezzo',

    thumbnail: '',

    category: {

        id: 4,

        name: 'Nintendo'

    },

    price: 35.00

}, {

    id: 5,

    name: 'Resident Evil 3',

    studio: 'Capcom',

    thumbnail: '',

    category: {

        id: 5,

        name: 'Playstation'

    },

    price: 40.00

}];


let filters = {

    searchText: '',

    categories: []

}


/*----------------------------

    functions

----------------------------*/


let filterStores = function (stores, filters) {


    let filteredStores = stores.filter(store => (

        store.name.toLowerCase().includes(filters.searchText.toLowerCase()) &&

        (

            filters.categories.includes(store.category.name.toLowerCase()) ||

            filters.categories.length === 0 //No selected categories, show all

        )

    ));


    let grid = document.querySelector('.grid');

    grid.innerHTML = '';


    filteredStores.forEach(function (store) {

        let li = document.createElement('li');

        li.textContent = store.name;

        grid.appendChild(li);

    });

}


/*----------------------------

    events

----------------------------*/


document.addEventListener('DOMContentLoaded', function () {

    filterStores(stores, filters);


    document.querySelector('.store-search').addEventListener('input', function (event) {

        filters.searchText = event.target.value;

        filterStores(stores, filters);

    });


    document.querySelectorAll('.category-cb').forEach(function (checkbox) {

        checkbox.addEventListener('change', function (event) {

            if (checkbox.checked) {

                filters.categories.push(event.target.value);

            } else {

                filters.categories.splice(filters.categories.indexOf(event.target.value), 1);

            }

            filterStores(stores, filters);

        });

    });

});

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

</head>

<body>


    <aside>

        <ul>

            <li>

                <label>

                    <input type="checkbox" value="playstation" class="category-cb">

                    <span>Playstation</span>

                </label>

            </li>

            <li>

                <label>

                    <input type="checkbox" value="xbox" class="category-cb">

                    <span>Xbox</span>

                </label>

            </li>

            <li>

                <label>

                    <input type="checkbox" value="nintendo" class="category-cb">

                    <span>Nintendo</span>

                </label>

            </li>

        </ul>

    </aside>

    <main>

        <input type="text" class="store-search" placeholder="Search">

        <ul class="grid"></ul>

    </main>


    <script src="app.js"></script>

</body>

</html>


查看完整回答
反對 回復 2022-09-23
  • 1 回答
  • 0 關注
  • 112 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號