Javascript array filter one

.filter ( )

Фильтры для воды удерживают вредные частицы, а фильтр JS — плохие значения.

Кратко

Скопировать ссылку «Кратко» Скопировано

Метод массива .filter ( ) позволяет получить новый массив, отфильтровав элементы с помощью переданной колбэк-функции. Колбэк-функция будет вызвана для каждого элемента массива и по результату функции примет решение включать этот элемент в новый массив или нет.

Пример

Скопировать ссылку «Пример» Скопировано

 const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] const evenOnly = nums.filter(function (n)  const remainder = n % 2 return remainder === 0>) const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] const evenOnly = nums.filter(function (n)  const remainder = n % 2 return remainder === 0 >)      

Результат будет [2 , 4 , 6 , 8 , 10 ] .

 const languages = ["Java", "TypeScript", "C#", "JavaScript", "Julia"] const jLanguages = languages.filter(function (language)  return language.startsWith("J")>) const languages = ["Java", "TypeScript", "C#", "JavaScript", "Julia"] const jLanguages = languages.filter(function (language)  return language.startsWith("J") >)      

Результат будет [‘ Java’ , ‘ Java Script’ , ‘ Julia’ ] .

Как пишется

Скопировать ссылку «Как пишется» Скопировано

Аналогично методу .for Each ( ) , методу .filter ( ) необходимо передать аргументом функцию. Главное отличие — функция должна возвращать boolean, т. е. результатом должен быть true или false . Такие функции называют предикатами.

Это предикат, так как функция возвращает boolean-результат сравнения:

 function isPositive(num)  return num > 0> function isPositive(num)  return num > 0 >      

Это предикат, так как метод .includes ( ) у строки возвращает boolean:

 function hasChar(str, char)  return str.includes(char)> function hasChar(str, char)  return str.includes(char) >      

А вот это не предикат, ведь функция возвращает число, даже несмотря на то, что любое число в JavaScript (кроме 0) может быть приведено к true :

 function sum(a, b)  return a + b> function sum(a, b)  return a + b >      

От результата выполнения функции зависит, попадёт ли элемент в итоговый массив:

 function predicate(num)  if (num >= 5)  return true > return false> const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] // передаём предикатnums.filter(predicate) // [5, 6, 7, 8, 9, 10] // Либо делаем короче и просто возвращаем результат сравненияnums.filter((num) => num >= 5) // [5, 6, 7, 8, 9, 10] function predicate(num)  if (num >= 5)  return true > return false > const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] // передаём предикат nums.filter(predicate) // [5, 6, 7, 8, 9, 10] // Либо делаем короче и просто возвращаем результат сравнения nums.filter((num) => num >= 5) // [5, 6, 7, 8, 9, 10]      

Функция, которую мы передаём в метод .filter ( ) , принимает три параметра:

  • item — элемент массива в текущей итерации;
  • index — индекс текущего элемента;
  • arr — сам массив, который мы перебираем.
 const languages = ["Java", "TypeScript", "C#", "JavaScript", "Julia"] languages.filter(function (item, index, arr)  console.log("Текущий элемент " + item) console.log("Индекс " + index) console.log("Массив " + arr) return index >= 3>) const languages = ["Java", "TypeScript", "C#", "JavaScript", "Julia"] languages.filter(function (item, index, arr)  console.log("Текущий элемент " + item) console.log("Индекс " + index) console.log("Массив " + arr) return index >= 3 >)      

💡 В новом массиве отфильтрованные элементы будут находиться в том же порядке, в котором они были в исходном массиве.

💡 .filter ( ) возвращает новый массив, при этом исходный массив никак не изменится.

💡 Из-за того, что JavaScript имеет динамическую типизацию, то нам ничего не мешает возвращать какое угодно значение из функции. В этом случае JavaScript сам определит его истинность. Стоит помнить, что значения 0 , undefined , null и пустая строка » считаются ложными и равны false .

 const goods = [  name: "AirPods", description: "Классные беспроводные наушники", >,  name: "MacBook Pro", description: "Ноутбук на все случаи жизни", >,  name: "iPhone", description: "", >,  name: "Дошик", >,] // Просто возвращаем значения описанияconst withDescription = goods.filter(function (item)  return item.description>) const goods = [  name: "AirPods", description: "Классные беспроводные наушники", >,  name: "MacBook Pro", description: "Ноутбук на все случаи жизни", >,  name: "iPhone", description: "", >,  name: "Дошик", >, ] // Просто возвращаем значения описания const withDescription = goods.filter(function (item)  return item.description >)      

В результате получим массив с AirPods и MacBook Pro.

Для хорошей читаемости и понимания кода лучше всегда явно возвращать boolean-значение из функции-предиката.

💡 В JavaScript функция, в которой нет явного возвращаемого значения (т. е. нет return ) все равно возвращает undefined . Потому, если забыть вернуть результат в функции в методе .filter ( ) , то в результате получим пустой массив, так как отфильтруются все элементы.

 const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] const filtered = nums.filter(function (num)  // Забыли вернуть результат num >= 5>) const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] const filtered = nums.filter(function (num)  // Забыли вернуть результат num >= 5 >)      

Получим [ ] , потому что undefined считается как false .

Как понять

Скопировать ссылку «Как понять» Скопировано

Метод .filter ( ) позволяет получить новый массив с отфильтрованными значениями на основании данных исходного. Несмотря на то, что то же самое можно сделать, используя обычный цикл for или while , метод .filter ( ) позволяет сделать это проще.

Если решать такую задачу без .filter ( ) , то выйдет так:

 const nums = [1, 2, 3, 4, 5, 6]const odds = [] for (let i = 0; i < nums.length; i++)  if (nums[i] % 2 !== 0)  odds.push(nums[i]) >> console.log(odds) const nums = [1, 2, 3, 4, 5, 6] const odds = [] for (let i = 0; i  nums.length; i++)  if (nums[i] % 2 !== 0)  odds.push(nums[i]) > > console.log(odds)      

.filter ( ) позволит сильно сократить код и сделать его понятнее:

 const nums = [1, 2, 3, 4, 5, 6] const odds = nums.filter(function (num)  return num % 2 !== 0>)console.log(odds) const nums = [1, 2, 3, 4, 5, 6] const odds = nums.filter(function (num)  return num % 2 !== 0 >) console.log(odds)      

На практике

Скопировать ссылку «На практике» Скопировано

Егор Огарков советует

Скопировать ссылку «Егор Огарков советует» Скопировано

🛠 Так как filter возвращает массив, то у полученного массива мы можем продолжать по цепочке вызывать другие методы массива.

 const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] const result = nums.filter(num => num >= 5).map(. ).reduce(. ) const nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] const result = nums.filter(num => num >= 5).map(. ).reduce(. )      

🛠 В filter в качестве функции можно передать конструктор Boolean . Таким образом можно легко и быстро отфильтровать все элементы, которые при приведении к boolean будут равны false .

 const num = 3 const elements = [0, "", "one", "two", num === 3 && "three", null].filter( Boolean) const num = 3 const elements = [0, "", "one", "two", num === 3 && "three", null].filter( Boolean )      

Результат — [‘one’ , ‘two’ , ‘three’ ] .

Источник

Метод массива filter() в JavaScript

Метод массива filter() в JavaScript

Метод filter() Array создает новый массив с элементами, которые соответствуют определенным критериям существующего массива:

var numbers = [1, 3, 6, 8, 11]; var lucky = numbers.filter(function(number)  return number > 7; >); // [ 8, 11 ] 

В примере выше берется массив numbers и возвращается новый массив filtered, содержащий только значения больше семи.

Синтаксис фильтра

var newArray = array.filter(function(item)  return condition; >); 

Аргумент item ссылается на текущий элемент массива, поскольку filter() сверяет его с условием condition . Этот метод полезен для доступа к свойствам объектов.

Если текущий элемент item соответствует условию, он отправляется в новый массив.

Фильтрация массива объектов

Метод filter() часто применяется для фильтрации массивов объектов по свойствам:

var heroes = [ name: “Batman”, franchise:DC>, name: “Ironman”, franchise: “Marvel”>, name: “Thor”, franchise: “Marvel”>, name: “Superman”, franchise:DC> ]; var marvelHeroes = heroes.filter(function(hero)  return hero.franchise == “Marvel”; >); // [ , ] 

Дополнительные ресурсы

Более подробную информацию по методу filter() можно найти в справочных материалах MDN.

Фильтрация — лишь один из нескольких методов итерации массивов в JavaScript. Прочитайте материал Использование методов итерации массивов в JavaScript, чтобы узнать о других методах, таких как map() и reduce() .

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Источник

Читайте также:  Запретить выделение текста
Оцените статью