(ES6) Фильтрация данных с полем ввода (мин. Массив) - PullRequest
0 голосов
/ 11 июня 2018

Я работаю над сайтом, где вы можете искать музыку.Я хочу поставить опцию фильтра, где люди могут фильтровать по минимальному возрасту.

Это мой файл JSON:

{
  "artists":[
{
"name": "Martin Garrix",
"origin": "Netherlands",
"age": "22 years old",
"artist_id": "c0dc129d8a886a2c9bf487b826c3614a6630fb9c",
"best_song":"https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/98081145&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true"

},

{
  "name": "Armin van Buuren",
  "origin": "Netherlands",
  "age": "41 years old",
  "artist_id": "8b0a178ce06055312456cccc0c9aa7679d8054f1",
  "best_song":"https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/181749728&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true"
},

{
  "name": "Don Diablo",
  "origin": "Netherlands",
  "age": "38 years old",
  "artist_id": "178c6e7e3bf24710d4895048586a86f1bb81d842",
  "best_song":"https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/212802517&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true"


},

{
  "name": "David Guetta",
  "origin": "France",
  "age": "50 years old",
  "artist_id": "c2714423228a8012ad37af0186447cbb7ff589f7",
  "best_song":"https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/140006470&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true"


},

{
  "name": "Alesso",
  "origin": "Sweden",
  "age": "26 years old",
  "artist_id": "69fa09f6e181093fe0ea2ce1a4099066509f7837",
  "best_song":"https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/288914798&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true"

}
]
}

И это мой HTML:

<div class = "div-age">
<label for="age-select">Minimum age</label>
<input type="text" class = "search-age">
</div>

Так, например;Если вы введете 40 в поле ввода, вы получите только «Armin van Buuren» и «David Guetta».

Это то, что у меня сейчас.

document.querySelector(`.search-age`).addEventListener(`keyup` , e => {
    const term = e.target.value.toLowerCase();
    const ageList = document.getElementsByClassName(`artist-info`);
    Array.from(ageList).forEach(function(ageList) {
      const artistAge = ageList.querySelector(`.age`).textContent;
      if (artistAge.toLowerCase().includes(term)) {
        ageList.style.display = `flex`;
      } else {
        ageList.style.display = `none`;
      }
    })
  });

Проблема, с которой я столкнулся сейчас, заключается в том, что она фильтрует только точное число.Так, например, я поставил 22, я получаю только «Мартин Гаррикс»

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

с filter () , вы можете сделать это следующим образом:

const input = {
  artists: [
    {
      name: 'Martin Garrix',
      origin: 'Netherlands',
      age: '22 years old',
      artist_id: 'c0dc129d8a886a2c9bf487b826c3614a6630fb9c',
      best_song:
        'https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/98081145&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true',
    },

    {
      name: 'Armin van Buuren',
      origin: 'Netherlands',
      age: '41 years old',
      artist_id: '8b0a178ce06055312456cccc0c9aa7679d8054f1',
      best_song:
        'https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/181749728&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true',
    },

    {
      name: 'Don Diablo',
      origin: 'Netherlands',
      age: '38 years old',
      artist_id: '178c6e7e3bf24710d4895048586a86f1bb81d842',
      best_song:
        'https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/212802517&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true',
    },

    {
      name: 'David Guetta',
      origin: 'France',
      age: '50 years old',
      artist_id: 'c2714423228a8012ad37af0186447cbb7ff589f7',
      best_song:
        'https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/140006470&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true',
    },

    {
      name: 'Alesso',
      origin: 'Sweden',
      age: '26 years old',
      artist_id: '69fa09f6e181093fe0ea2ce1a4099066509f7837',
      best_song:
        'https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/288914798&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true',
    },
  ],
};
const minAge = 40;

const output = input.artists.filter(cur => minAge < parseInt(cur.age));
console.log(output);
0 голосов
/ 11 июня 2018

Пара вещей:

  1. вам не нужно Шаблонные литералы , вы можете просто использовать простую строку.

  2. Не используйте keyup, вместо этого используйте input как событие для таких вещей: он также получает информацию, если пользователь вставляет значение с помощью устройства, отличного от клавиатуры - например, мыши.

  3. Не используйте getElementsByClassName , так как он возвращает активную HTMLCollection.Вместо этого используйте querySelectorAll , который возвращает статический NodeList.Он также поддерживает forEach напрямую, поэтому вам не нужно использовать Array.from.

  4. Don't shadowing переменной, так какageList в коде, который вы написали, например: это может привести к неожиданным ошибкам.

Сказал, что:

// you might not want to query all the time this list,
// every time the user change the input value.
const ageList = document.querySelectorAll('.artist-info');

document.querySelector('.search-age').addEventListener('input' , e => {
    // no need to lowercase, it's numeric.
    // you might want to add some check or constraint on
    // <input> validation
    const term = +e.target.value;

    ageList.forEach(node => {
      const artistAge = node.querySelector('.age').textContent;
      node.style.display = parseInt(artistAge, 10) >= term ? 'flex' : 'none';
    })
  });
0 голосов
/ 11 июня 2018

Вы можете попытаться преобразовать строку возраста в соответствующее число, используя parseInt, а затем сравнить его со значением:

// Convert term and artist's age to corresponding integers
term = parseInt(term, 10);
artistAge = parseInt(artistAge, 10);

if (artistAge >= term) {
  ageList.style.display = `flex`;
} else {
  // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...