Крутые трюки в JavaScript
Мышление, входящее в это:
Приведенный ниже код следует парадигме декларативного программирования.
Мы сообщаем компьютеру что мы хотим, а не как это сделать.
1) Манипулирование списком объектов или списком списка (с использованием сокращения)
Мы должны использовать Reduce, когда работаем с массивом и хотим, чтобы он возвращал что-то еще. (Reduce может вести себя как любая другая функция массива Javascript, например карта, фильтр)
Приложения
Базовый пример: я хочу уменьшить массив и получить сумму массива
const arr = [1,2,3,4,5]; const total = arr.reduce((arr,item) => acc+=item,0); //total = 15
Расширенный пример: удаление дубликатов из массива
Примечание: нам не нужен оператор return в методе сокращения.
var array = [1,1,3,3]; var uniques = array.reduce((unique, item) => unique.includes(item) ? unique: [...unique, item], []); console.log(uniques); //[1,3]
Расширенный пример: мы хотим создать новый объект с downloadCounts в качестве ключа и массивом FileDownloaded.
Примечание:
- Обратите внимание, что мы удаляем FileDownloaded из ответа.
- Здесь мы формируем новый объект (:) с ключом downloadCounts и значением в виде массива.
- Мы можем вернуть объект прямо из них, нам не понадобится оператор return
- Это работает только в том случае, если мы заранее знаем ключ конечного объекта и работаем с одним и тем же объектом во всех итерациях.
response.reduce( (acc, {FileDownloaded}) => ({ ...acc, downloadCounts: get(acc,['downloadCounts'], []).concat(FileDownloaded) }) , {} );
Расширенный пример: здесь мы пытаемся подсчитать количество пользователей в каждой возрастной группе)
Примечание:
- работает, когда ключ объекта динамический.
- Поскольку мы манипулируем внутренними значениями аккумулятора, нам нужно вернуть его обратно, чтобы обновить значение acc.
const users = [ { id: 11, name: 'Adam', age: 23, group: 'editor' }, { id: 47, name: 'John', age: 28, group: 'admin' }, { id: 85, name: 'William', age: 34, group: 'editor' }, { id: 97, name: 'Oliver', age: 28, group: 'admin' } ]; const groupByAge = users.reduce((acc, it) => { acc[it.age] = acc[it.age] + 1 || 1; return acc; }, {});// groupByAge is {23: 1, 28: 2, 34: 1}
2) Управление списком объектов или списком списка (с использованием карты)
Мы должны использовать это, когда хотим изменить/преобразовать весь массив
Приложения
Простой пример: я хочу умножить все числа в массиве на 10.
const arr = [1,2,3,4,5]; const newArray = arr.map(i => i*10); //newArray = [10,20,30,40,50]
3) Управление списком объектов (с использованием фильтра)
Следует ожидать, что он буквально проверяет список объектов списка и возвращает те, которые проходят проверку!
Приложения
Простой пример (Работа с одним списком): я хочу получить этих учащихся в возрасте == 23, поэтому мы отфильтровываем остальных учащихся.
const students = [ { id: 11, name: 'Adam', age: 23, group: 'editor' }, { id: 47, name: 'John', age: 28, group: 'admin' }, { id: 85, name: 'William', age: 34, group: 'editor' }, { id: 97, name: 'Oliver', age: 28, group: 'admin' } ]; var res = students.filter(it => it.age === 23); //res = [ { id: 11, name: 'Adam', age: 23, group: 'editor' }]
Расширенный пример (Работа с двумя списками): я хочу выяснить, чего не хватает в списке, со ссылкой на основной список
контекст: выяснить, какие даты отсутствуют в текущем списке
var mainList = ["2020-8","2020-7"]; var currentList = ["2020-7"]; var remainingDates = mainList.filter(value => !currentList.includes(value)); //remaininDates = ["2020-8"];
4) Сила оператора спреда
Spread расширяет повторяемый объект (массив, строку, карту, набор, узлы DOM) на отдельные элементы.
Приложения
Преобразование строки в символы
const name = "abc"; const chars = [...name]; //chars = ['a','b','c']
Удалить дубликаты из массива
const num = [1,3,3,1,1]; const uniqueNum = [...new Set(num)]; //uniqueNum = [1,3]
Использовать для слияния списка/объекта
- По-старому: конкат
const fruits = ['🍈', '🍉', '🍋', '🍌']; const vegetables = ['🍅', '🍆', '🥒']; const fruitsAndVeg = [...fruits, ...vegetables]; //['🍈', '🍉', '🍋', '🍌','🍅', '🍆', '🥒'] const user1 = {name : "John", age : 20 }; const user2 = {name : "Ram", salary: '20K' }; const userCopy = {...user1, ...user2}; // userCopy {name : "Ram", age :20 , salary : '20K'};
Передача аргументов
const sum = (a,b) => a+b; const num = [1,2]; sum(...num); // 3
Деструктурирование списка/объекта (используйте много в передаче реактивных реквизитов)
const [melon, ...fruits ] = ['🍉', '🍋', '🍌', '🍊']; melon; //🍉 fruits; // [ '🍋', '🍌', '🍊'] const user = {name : "Ram", age: 20, salary: '20K', job :"Tester"}; const { name, age, ...details } = user; name; // Ram age; // 20 details; // {salary: '20K', job : 'Tester'};
5) Сортировка в Javascript (компаратор)
Здесь мы пытаемся отсортировать объект responseJson по его ключу yearmonth в порядке возрастания.
responseJson.sort((a, b) => { a = a.yearmonth.split("-"); b = b.yearmonth.split("-"); return new Date(a[0], a[1], 1) - new Date(b[0], b[1], 1); });
6) Функция экспорта и импорта (деструктуризация)
//file 1 const add = (a,b) => a+b const sub = (a,b) => a-b exports.add = add; exports.sub = sub; //file 2 const {add, sub} = require('./file1') add(1,1) //2
7) Деструктуризация объекта (переименование ключа объекта)
Извлечение авторизации из объекта заголовка
const header = {Authorization: "!@#!@#"} const {Authorization} = header console.log(Authorization) //!@#!@#
Переименование имени переменной авторизации
const {Authorization: authorizationHeader} = header console.log(authorizationHeader) //!@#!@#
Деконструкция вложенного объекта
- Обратите внимание, что нам нужно {} , иначе будет создан новый объект, т.е.
const header = {authorizer: {claims: {token_use: 'access'}}} //new object created const {authorizer:claims} = header console.log(claims); //{ claims: { token_use: 'access' } } const {authorizer:{claims}} = header console.log(claims); //{ token_use: 'access' } const {authorizer: {claims: {token_use} } } = header; console.log(token_use); //access
Проверить правильность в реквизитах (React)
const handleChange = ({ target: { name, value: inputValue } = {} } ={}) const { authorizer:{claims} = {} } = requestContext || {};