Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.08.2023, 19:09
Новичок на форуме
Отправить личное сообщение для alena0309 Посмотреть профиль Найти все сообщения от alena0309
 
Регистрация: 11.08.2023
Сообщений: 5

Вопрос по 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);
Ответить с цитированием
  #2 (permalink)  
Старый 11.08.2023, 20:41
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,498

Смотри в консоль и читай что тебе пишет.

У тебя скобки криво расставлены: .map у тебя идёт после includes, а не после filter.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 11.08.2023, 21:18
Новичок на форуме
Отправить личное сообщение для alena0309 Посмотреть профиль Найти все сообщения от alena0309
 
Регистрация: 11.08.2023
Сообщений: 5

Сообщение от Aetae Посмотреть сообщение
Смотри в консоль и читай что тебе пишет.

У тебя скобки криво расставлены: .map у тебя идёт после includes, а не после filter.

Я прошу прощения, а как должно быть? В консоле написано, что map не функция.
Ответить с цитированием
  #4 (permalink)  
Старый 11.08.2023, 21:56
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,498

Раскрыл запись и вынес наверх то что необязательно задавать налету:
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(``);
}

Так гораздо очевиднее проблема.

Если вы пока теряетесь в коротких записях рекомендую всё расписывать подробно, а не в одну строчку, так гораздо меньше шанс запутаться.
__________________
29375, 35
Ответить с цитированием
  #5 (permalink)  
Старый 11.08.2023, 22:21
Новичок на форуме
Отправить личное сообщение для alena0309 Посмотреть профиль Найти все сообщения от alena0309
 
Регистрация: 11.08.2023
Сообщений: 5

Сообщение от Aetae Посмотреть сообщение
Раскрыл запись и вынес наверх то что необязательно задавать налету:
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(``);
}

Так гораздо очевиднее проблема.

Если вы пока теряетесь в коротких записях рекомендую всё расписывать подробно, а не в одну строчку, так гораздо меньше шанс запутаться.
Поняла) Тогда завтра попробую вставить Ваш код.
Ответить с цитированием
  #6 (permalink)  
Старый 12.08.2023, 09:19
Новичок на форуме
Отправить личное сообщение для alena0309 Посмотреть профиль Найти все сообщения от alena0309
 
Регистрация: 11.08.2023
Сообщений: 5

Не знаю... Не получается вывести на 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> &nbsp ${item.phone}
  <br>
  <br>
   <i class="icono-mail"></i> &nbsp ${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, 12.08.2023 в 09:45.
Ответить с цитированием
  #7 (permalink)  
Старый 12.08.2023, 11:26
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,498

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>
__________________
29375, 35

Последний раз редактировалось Aetae, 12.08.2023 в 11:28.
Ответить с цитированием
  #8 (permalink)  
Старый 12.08.2023, 12:00
Новичок на форуме
Отправить личное сообщение для alena0309 Посмотреть профиль Найти все сообщения от alena0309
 
Регистрация: 11.08.2023
Сообщений: 5

Я, наверное, не так описала. У меня есть 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> &nbsp ${item.phone}
  <br>
  <br>
   <i class="icono-mail"></i> &nbsp ${item.email}
   <br>
   </div>
   </div>
`).join(" ");
        })



Я никак не могу додуматься, как сделать форму поиск-фильтр по странице.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
post read write JSON Konstantin47 Node.JS 2 26.07.2021 16:06
Не обновляется JSON т123 AJAX и COMET 2 19.04.2019 07:41
Проблемы с jqGrid и JSON massacra_panda Библиотеки/Тулкиты/Фреймворки 1 08.10.2012 16:44
JSON или JSONP для запросов на другой сервер? Метод GET, для длинных сообщений? Kotakota jQuery 5 23.08.2011 23:12
передача JSON на сервер mikeles AJAX и COMET 0 04.03.2011 11:28