Я слушал отличный подкаст Syntax FM, в котором обобщены полезные массивы JavaScript и методы объектов. Эти методы помогают разработчикам писать чистый и читаемый код. Многие из этих методов уменьшают потребность в использовании служебных библиотек, таких как Lodash.

Все методы в этой статье объединены в цепочку, то есть их можно использовать в сочетании друг с другом, и они также не изменяют данные, что особенно важно при работе с React. Со всеми этими методами массивов и объектов вы обнаружите, что вам больше никогда не придется повторять for или while цикл.

.filter()

Создает новый массив в зависимости от того, соответствуют ли элементы массива определенному условию.

Пример

Создайте набор возрастов учащихся, соответствующих возрасту, установленному законом для употребления алкоголя.

const studentsAge = [17, 16, 18, 19, 21, 17];
const ableToDrink = studentsAge.filter( age => age > 18 );
// ableToDrink will be equal to [19, 21]

.map()

Создает новый массив, манипулируя значениями в другом массиве. Отлично подходит для обработки данных и часто используется в React, потому что это неизменяемый метод.

Пример

Создайте массив, который добавляет $ в начало каждого числа.

const numbers = [2, 3, 4, 5];
const dollars = numbers.map( number => '$' + number);
// dollars will be equal to ['$2', '$3', '$4', '$5']

.reduce()

Этот часто упускаемый из виду метод использует аккумулятор для уменьшения всех элементов в массиве до одного значения. Отлично подходит для подсчета итогов. Возвращаемое значение может быть любого типа (например, объект, массив, строка, целое число).

Пример

Сложите целые числа в массив.

const numbers = [5, 10, 15];
const total = numbers.reduce( (accumulator, currentValue) => accumulator + currentValue);
// total will be equal to 30

Есть несколько действительно интересных вариантов использования .reduce(), описанных в документах MDN, которые предоставляют примеры того, как делать такие вещи, как выравнивание массива массивов, группировка объектов по свойству и удаление повторяющихся элементов в массиве.

.forEach()

Применяет функцию к каждому элементу массива.

Пример

Записывать каждый элемент массива в консоль

const emotions = ['happy', 'sad', 'angry'];
emotions.forEach( emotion => console.log(emotion) );
// Will log the following:
// 'happy'
// 'sad'
// 'angry'

.some()

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

Пример

Проверьте, есть ли хотя бы один 'admin' в массиве.

const userPrivileges = ['user', 'user', 'user', 'admin'];
const containsAdmin = userPrivileges.some( element => element === 'admin');
// containsAdmin will be equal to true

.every()

Аналогично .some(), но проверяет, все ли элементы в массиве соответствуют условию.

Пример

Проверьте, все ли рейтинги равны или превышают 3 звезды.

const ratings = [3, 5, 4, 3, 5];
const goodOverallRating = ratings.every( rating => rating >= 3 );
// goodOverallRating will be equal to true

.includes()

Проверяет, содержит ли массив определенное значение. Он похож на .some(), но вместо поиска условия, которое нужно передать, он проверяет, содержит ли массив определенное значение.

Пример

Проверьте, есть ли в массиве элемент со строкой ‘waldo’.

const names = ['sophie', 'george', 'waldo', 'stephen', 'henry'];
const includesWaldo = names.includes('waldo');
// includesWaldo will be equal to true

Array.from()

Это статический метод, который создает массив на основе другого массива или строки. Вы также можете передать функцию обратного вызова map в качестве аргумента для дальнейшего формирования данных в новом массиве. Честно говоря, я не совсем понимаю, зачем кому-то использовать это вместо .map() метода.

Пример

Создайте массив из строки.

const newArray = Array.from('hello');
// newArray will be equal to ['h', 'e', 'l', 'l', 'o']

Создайте массив, который имеет удвоенное значение для каждого элемента в другом массиве.

const doubledValues = Array.from([2, 4, 6], number => number * 2);
// doubleValues will be equal to [4, 8, 12]

Object.values()

Вернуть массив значений объекта.

Пример

const icecreamColors = {
    chocolate: 'brown',
    vanilla: 'white',
    strawberry: 'red',
}

const colors = Object.values(icecreamColors);
// colors will be equal to ["brown", "white", "red"]

Object.keys()

Вернуть массив ключей объекта.

Пример

const icecreamColors = {
  chocolate: 'brown',
  vanilla: 'white',
  strawberry: 'red',
}

const types = Object.keys(icecreamColors);
// types will be equal to ["chocolate", "vanilla", "strawberry"]

Object.entries()

Создает массив, содержащий массивы пар ключ / значение объекта.

Пример

const weather = {
  rain: 0,
  temperature: 24,
  humidity: 33,
}

const entries = Object.entries(weather);
// entries will be equal to
// [['rain', 0], ['temperature', 24], ['humidity', 33]]

Распространение массива

Распространение массивов с помощью оператора распространения () позволяет расширять элементы в массиве. Это полезно при объединении нескольких массивов. Это также хороший способ избежать использования метода splice() при удалении определенных элементов из массива, поскольку его можно комбинировать с методом slice() для предотвращения прямого изменения массива.

Пример

Объедините два массива.

const spreadableOne = [1, 2, 3, 4];
const spreadableTwo = [5, 6, 7, 8];

const combined = [...spreadableOne, ...spreadableTwo];
// combined will be equal to [1, 2, 3, 4, 5, 6, 7, 8]

Удалите элемент массива, не изменяя исходный массив.

const animals = ['squirrel', 'bear', 'deer', 'salmon', 'rat'];
const mammals = [...animals.slice(0,3), ...animals.slice(4)];
// mammals will be equal to ['squirrel', 'bear', 'deer', 'rat']

Распространение объекта

Распространение объекта позволяет добавлять новые свойства и значения к объекту без изменений (т.е. создается новый объект), а также его можно использовать для объединения нескольких объектов вместе. Следует отметить, что раскладывающиеся объекты не выполняют вложенное копирование.

Пример

Добавьте новое свойство и значение объекта, не изменяя исходный объект.

const spreadableObject = {
  name: 'Robert',
  phone: 'iPhone'
};

const newObject = {
  ...spreadableObject,
  carModel: 'Volkswagen'
}
// newObject will be equal to
// { carModel: 'Volkswagen', name: 'Robert', phone: 'iPhone' }

Функциональный отдых

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

Пример

Отобразите массив переданных аргументов.

function displayArgumentsArray(...theArguments) {
  console.log(theArguments);
}

displayArgumentsArray('hi', 'there', 'bud');
// Will print ['hi', 'there', 'bud']

Object.freeze()

Запрещает вам изменять существующие свойства объекта или добавлять новые свойства и значения к объекту. Часто люди думают, что const делает, однако const позволяет изменять объект.

Пример

Закрепите объект, чтобы предотвратить изменение свойства name.

const frozenObject = {
  name: 'Robert'
}

Object.freeze(frozenObject);

frozenObject.name = 'Henry';
// frozenObject will be equal to { name: 'Robert' }

Object.seal()

Останавливает добавление любых новых свойств к объекту, но позволяет изменять существующие свойства.

Пример

Запечатайте объект, чтобы предотвратить добавление свойства wearsWatch.

const sealedObject = {
  name: 'Robert'
}

Object.seal(sealedObject);

sealedObject.name = 'Bob';
sealedObject.wearsWatch = true;
// sealedObject will be equal to { name: 'Bob' }

Object.assign()

Позволяет объединять объекты вместе. Этот метод на самом деле не нужен, потому что вместо него можно использовать синтаксис распространения объекта. Как и оператор распространения объекта, Object.assign() не выполняет глубокого клонирования. Lodash - ваш лучший друг, когда дело касается глубокого клонирования объектов.

Пример

Соедините два объекта в один.

const firstObject = {
  firstName: 'Robert'
}

const secondObject = {
  lastName: 'Cooper'
}

const combinedObject = Object.assign(firstObject, secondObject);
// combinedObject will be equal to { firstName: 'Robert', lastName: 'Cooper' }

Если вы нашли эту статью интересной и вас интересует разработка интерфейса, подпишитесь на меня в Twitter, Github или LinkedIn. .

✉️ Подпишитесь на рассылку еженедельно Email Blast 🐦 Подпишитесь на CodeBurst на Twitter , просмотрите 🗺️ Дорожная карта веб-разработчиков на 2018 год и 🕸️ Изучите веб-разработку с полным стеком .