Вопрос по json.
Здравствуйте. Имеется json. Вроде бы получилось вывести и стилизовать его на html, но не получается сделать фильтрацию. Т.е. поле, в котором при вводе данных name, будет фильтроваться. Что не так? Что Я упустила. Спасибо!
let users = []; let nameFilter = `name`; const render = () => { document.body.innerHTML = users .filter((item) => !nameFilter || item.name.toUpperCase().includes(nameFilter.toUpperCase()) .map((item) => `<span class="name">${item.name}</span>`).join(``)); } fetch(`users.json`) .then((res) => res.json()) .then((data) => users = data) .then(render); |
Смотри в консоль и читай что тебе пишет.
У тебя скобки криво расставлены: .map у тебя идёт после includes, а не после filter. |
Цитата:
Я прошу прощения, а как должно быть? В консоле написано, что map не функция. |
Раскрыл запись и вынес наверх то что необязательно задавать налету:
const nameFilterUpper = nameFilter.toUpperCase(); const wrapItemNameInSpan = (item) => `<span class="name">${item.name}</span>`; // сейчас у тебя так const render = () => { document.body.innerHTML = users.filter((item) => { const itemNameUpper = item.name.toUpperCase(); // естественно .map не функция, т.к. .includes возаращает Boolean, а у Boolean нет метода .map return !nameFilter || itemNameUpper.includes(nameFilterUpper).map(wrapItemNameInSpan).join(``) }); } // а должно быть так const render = () => { document.body.innerHTML = users.filter((item) => { const itemNameUpper = item.name.toUpperCase(); return !nameFilter || itemNameUpper.includes(nameFilterUpper) }).map(wrapItemNameInSpan).join(``); } Так гораздо очевиднее проблема. Если вы пока теряетесь в коротких записях рекомендую всё расписывать подробно, а не в одну строчку, так гораздо меньше шанс запутаться. |
Цитата:
|
Не знаю... Не получается вывести на html-страницу форму фильтра. Выводится только это:
fetch("users.json") .then(res=>res.json()) .then(data=>{ document.body.innerHTML = data.map((item)=> ` <div class="textcols-item show-modal"> <div class="trigger"> <li style="list-style-type: none"><span class="name"><b><h3>${item.name}</h3></b></span></li> <br> <br> <i class="icono-iphone"></i>   ${item.phone} <br> <br> <i class="icono-mail"></i>   ${item.email} <br> </div> </div> `).join(" "); }) А этот код не вывод: const nameFilterUpper = nameFilter.toUpperCase(); const wrapItemNameInSpan = (item) => `<span class="name">${item.name}</span>`; const render = () => { document.body.innerHTML = users.filter((item) => { const itemNameUpper = item.name.toUpperCase(); return !nameFilter || itemNameUpper.includes(nameFilterUpper) }).map(wrapItemNameInSpan).join(``); } fetch(`users.json`) .then((res) => res.json()) .then((data) => users = data) .then(render); |
alena0309, всё работает:
<script> let userJsonURL = 'users.json'; let users = []; let nameFilter = `name`; const nameFilterUpper = nameFilter.toUpperCase(); const wrapItemNameInSpan = (item) => `<span class="name">${item.name}</span>`; const render = () => { document.body.innerHTML = users.filter((item) => { const itemNameUpper = item.name.toUpperCase(); return !nameFilter || itemNameUpper.includes(nameFilterUpper) }).map(wrapItemNameInSpan).join(``); } // имитация users.json userJsonURL = 'data:,' + JSON.stringify([ {name: 'filtered'}, {name: 'Vasya-name'}, {name: 'Zlatan-name'} ]); fetch(userJsonURL) .then((res) => res.json()) .then((data) => users = data) .then(render); </script> |
Я, наверное, не так описала. У меня есть json. Код, который выводит на html-страницу:
fetch("users.json") .then(res=>res.json()) .then(data=>{ document.body.innerHTML = data.map((item)=> ` <div class="textcols-item show-modal"> <div class="trigger"> <li style="list-style-type: none"><span class="name"><b><h3>${item.name}</h3></b></span></li> <br> <br> <i class="icono-iphone"></i>   ${item.phone} <br> <br> <i class="icono-mail"></i>   ${item.email} <br> </div> </div> `).join(" "); }) Я никак не могу додуматься, как сделать форму поиск-фильтр по странице. |
Часовой пояс GMT +3, время: 16:41. |