Массив объектов js как перебрать
Перейти к содержимому

Массив объектов js как перебрать

  • автор:

Как перебрать массив объектов

введите сюда описание изображения

подскажите как перебрать массив объектов? Получаю такой массив объектов, и в моем компоненте нужно сравнить мои данные по id с массивом который приходит с сервера. Аля, const isDate = ( <переменная в которой я получил значение id с json>=== this.$attrs.date) Подскажите как именно это сделать?

Отслеживать
задан 5 дек 2021 в 23:59
for (let i =0; i < array.length; i++) < if ( array[i].id === compareID ) < . >> чем Вас не устраивает?
– user467825
6 дек 2021 в 4:19

Не очень понимаю, что именно нужно сделать. Если нужно просто достать объект из массива по id, то достаточно будет использовать метод find

11 дек 2021 в 22:57

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

const users = [ < id: 1, name: "Artem", age: 21 >, < id: 2, name: "Vova", age: 30 >, < id: 3, name: "Anna", age: 24 >]; users.map((user) => console.log(user.id + ' ' + user.name + ' ' + user.age))

Отслеживать
ответ дан 6 дек 2021 в 7:33
Artem Gabidov Artem Gabidov
121 4 4 бронзовых знака
почему map в данном случае, а не forEach, к примеру?
6 дек 2021 в 7:34
Он короче. Всего 3 буквы вместо 7
6 дек 2021 в 7:38
map возвращает данные и выделяет под это память
6 дек 2021 в 7:47
В этом случае не критично
6 дек 2021 в 7:50

  • javascript
  • массивы
  • vue.js
  • объекты
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Как перебрать массив из объектов и изменить внутри нужного объекта свойство, которое из себя так же представляет массив из объектов?

Каждый объект внутри articles это статья со своим уникальным id и остальными данными, в том числе и комментариями к статье внутри comments, которые так же лежат в массиве.
Я создал action, который в reducer передает из переменных только id комментария который нужно удалить из state.

const commentDelete = (idComment) => < return < type: 'COMMENT_DELETE', id:idComment, >; >;

Не знаю как правильно написать функцию, которая вернет новый state но уже без удаленного комментария. Через стандартный метод state.articles.filter() не получится, возможно нужно внутри метода filter добавить условие или цикл, но я так и не нашел решения.
Думал даже как нибудь изменить структуру state, чтобы так глубоко не лезть внутрь объекта, но не хочется переписывать остальные actions.

Для примера, вот как я делал удаление статьи

case 'ARTICLES_DELETE': const delArt = state.articles.filter(user => (user.id !== action.id)); return < . state, articles: [ . delArt] >;
  • Вопрос задан более трёх лет назад
  • 269 просмотров

Как перебрать массив объектов js

Чтобы перебрать массив с объектами, можно также воспользоваться функцией высшего порядка map.

const pupils = [  name: 'Kris', school: 11, >,  name: 'Yulia', school: 547, >,  name: 'Tom', school: 192, >, ]; pupils.map((pupil) => console.log(pupil)); // => // => // => 

Методы перебора массива (map, filter, reduce)

@serverSerrverlesskiy

Язык JavaScript оказывает явное предпочтение массивам перед другими структурами данных. У них много удобных специфических фишек, например, целый набор перебирающих методов: map , filter , reduce .

map​

Метод map() создаёт новый массив с результатом вызова указанной функции⚙️ для каждого элемента массива.

Видео​

Синтаксис​

let new_array = arr.map(function callback( currentValue[, index[, array]])   // Возвращает элемент для new_array >[, thisArg]) 

Метод map вызывает переданную функцию⚙️ callback один раз для каждого элемента, в порядке их появления и конструирует новый массив из результатов её вызова. Функция⚙️ callback вызывается только для индексов массива, имеющих присвоенные значения, включая undefined . Она не вызывается для пропущенных элементов массива (то есть для индексов, которые никогда не были заданы, были удалены или им никогда не было присвоено значение).

Функция⚙️ callback вызывается с тремя аргументами:

  • значением элемента,
  • индексом элемента
  • и массивом, по которому осуществляется проход.

Если в метод map был передан параметр thisArg , при вызове callback он будет использоваться в качестве значения this . В противном случае в качестве значения this будет использоваться значение undefined . В конечном итоге значение this , наблюдаемое из функции⚙️ callback , определяется согласно обычным правилам определения this , видимого из функции⚙️.

Метод map не изменяет массив, для которого он был вызван (хотя функция⚙️ может это делать!).

Диапазон элементов, обрабатываемых методом map , устанавливается до первого вызова функции⚙️ callback . Элементы, добавленные в массив после начала выполнения метода map , не будут посещены функцией⚙️ callback . Если существующие элементы массива изменяются функцией⚙️ callback , их значения, переданные в функцию⚙️, будут значениями на тот момент времени, когда метод map посетит их. Удалённые элементы посещены не будут.

Примеры:​

простой пример​

У вас есть массив со множеством объектов, каждый из которых представляет отдельного человека. Тут может быть очень много данных: имя, возраст, цвет волос и любимый персонаж из кинематографа, но в данный момент всё это не требуется – вы хотите получить только массив паспортных номеров этих людей, чтобы выдать им всем пропуска на конференцию.

Интерактивный редактор

function learnJavaScript()
const friends = [
passport: '03005988', name: 'Joseph Francis Tribbiani Jr', age: 32, sex: 'm' >,
passport: '03005989', name: 'Chandler Muriel Bing', age: 33, sex: 'm' >,
passport: '03005990', name: 'Ross Eustace Geller', age: 33, sex: 'm' >,
passport: '03005991', name: 'Rachel Karen Green', age: 31, sex: 'f' >,
passport: '03005992', name: 'Monica Geller', age: 31, sex: 'f' >,
passport: '03005993', name: 'Phoebe Buffay', age: 34, sex: 'f' >
]
let passports = friends.map(friend => friend.passport + ' ')
return passports
>
В определенных случаях вам может понадобится отобразить массив объектов с выбранными ключами в виде строки :​

Интерактивный редактор

function learnJavaScript()
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' >
]
let result = users.map(( id, age, group >) => `\n$id> $age> $group>`).join('')
return result
>
Создание массива значений Фаренгейта из массива значений Цельсия:​

Пример с обработкой каждого элемента массива заданной формулой :

Интерактивный редактор

function learnJavaScript()
let celsius = [-15, -5, 0, 10, 16, 20, 24, 32]
let fahrenheit = celsius.map(t => t * 1.8 + 32 + ' ')
return fahrenheit
>
Отображение массива чисел с использованием функции, содержащей аргумент :​

Интерактивный редактор

function learnJavaScript()
const numbers = [1, 4, 9]
const doubles = numbers.map(num => num * 2 + ' ')
return doubles
>

filter​

Метод filter() создаёт новый массив со всеми элементами, прошедшими проверку, задаваемую в передаваемой функции⚙️.

Результатом работы filter всегда является массив. Если функция⚙️ для элемента возвращает true (или любое «правдивое» значение), этот элемент попадает в результат, иначе – не попадает.

Синтаксис​

let newArray = arr.filter(function callback(element[, index, [array]])[, thisArg]) 

Описание​

Метод filter() вызывает переданную функцию⚙️ callback один раз для каждого элемента, присутствующего в массиве, и конструирует новый массив со всеми значениями, для которых функция⚙️ callback вернула true или значение, становящееся true при приведении в boolean . Функция⚙️ callback вызывается только для индексов массива, имеющих присвоенные значения; она не вызывается для индексов, которые были удалены или им значения никогда не присваивались. Элементы массива, не прошедшие проверку функцией⚙️ callback , просто пропускаются и не включаются в новый массив.

Функция⚙️ callback вызывается с тремя аргументами:

  • значение элемента;
  • индекс элемента;
  • массив, по которому осуществляется проход.

Если в метод filter() был передан параметр thisArg , при вызове функции⚙️ он будет использоваться в качестве значения this . В противном случае в качестве значения this будет использоваться значение undefined . В конечном итоге значение this , наблюдаемое из функции⚙️, определяется согласно обычным правилам определения this , видимого из функции⚙️.

Метод filter() не изменяет массив, для которого он был вызван.

Диапазон элементов, обрабатываемых методом filter() , устанавливается до первого вызова функции⚙️ callback . Элементы, добавленные в массив после начала выполнения метода filter() , не будут посещены функцией⚙️ callback . Если существующие элементы массива изменятся, значения, переданные в функцию⚙️ callback , будут значениями на тот момент времени, когда метод filter() посетит их. Удалённые элементы посещены не будут.

Пример​

Отфильтровывание всех маленьких значений​

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

Интерактивный редактор

function learnJavaScript()
const isBigEnough = value => value >= 10
let filtered = [12, 5, 8, 130, 44].filter(isBigEnough) + ' '
return filtered
>

reduce​

Метод reduce также запускается в контексте массива и вызывает функцию⚙️ для каждого элемента, но помимо этого, он аккумулирует результаты всех вызовов в одно значение. Этим поведением можно управлять.

reduce предназначен не для того, чтобы изменять элементы коллекции, как map . Его задача – подсчитать «сумму» всех элементов тем или иным способом, и вернуть ее.

Результирующим значением может быть что угодно: число, строка, объект, массив – все зависит от задачи, которую решает JavaScript разработчик.

Метод reduce принимает 2 параметра:

  • функция, как и map , который будет вызван последовательно для каждого элемента коллекции;
  • начальное значение аккумулятора.

В функции⚙️ тоже 2 аргумента:

  • первый – это накопленное значение (аккумулятор);
  • непосредственно элемент массива.

Синтаксис​

array.reduce(function callback[, initialValue]) 

Описание​

Метод reduce() выполняет функцию⚙️ callback один раз для каждого элемента, присутствующего в массиве, за исключением пустот, принимая четыре аргумента: начальное значение (или значение от предыдущего вызова callback ), значение текущего элемента, текущий индекс и массив, по которому происходит итерация.

При первом вызове функции⚙️, параметры accumulator и currentValue могут принимать одно из двух значений. Если при вызове reduce() передан аргумент initialValue , то значение accumulator будет равным значению initialValue , а значение currentValue будет равным первому значению в массиве. Если аргумент initialValue не задан, то значение accumulator будет равным первому значению в массиве, а значение currentValue будет равным второму значению в массиве.

Если массив пустой и аргумент initialValue не указан, будет брошено исключение TypeError . Если массив состоит только из одного элемента (независимо от его положения в массиве) и аргумент initialValue не указан, или если аргумент initialValue указан, но массив пустой, то будет возвращено одно это значение, без вызова функции⚙️ callback .

Начальное значение аккумулятора​

Разберемся с начальным значением. В примере оно равно 0 , так как мы считаем численное значение – сумму возрастов. На месте нуля может быть любое другое число/строка (пустая или нет)/объект/массив – любое значение, с которого вы начинаете аккумуляцию. Для примера объединим имена всех друзей в одну строчку :

Интерактивный редактор

function learnJavaScript()
const friends = [
passport: '03005988', name: 'Joseph Francis Tribbiani Jr', age: 32, sex: 'm' >,
passport: '03005989', name: 'Chandler Muriel Bing', age: 33, sex: 'm' >,
passport: '03005990', name: 'Ross Eustace Geller', age: 33, sex: 'm' >,
passport: '03005991', name: 'Rachel Karen Green', age: 31, sex: 'f' >,
passport: '03005992', name: 'Monica Geller', age: 31, sex: 'f' >,
passport: '03005993', name: 'Phoebe Buffay', age: 34, sex: 'f' >
]
const names = friends.reduce((accumulator, friend) => `$accumulator> $friend.name>, `, 'Friends: ')
return names
>

Здесь исходным значением послужила строка «Friends:» , к которой постепенно добавились имена всех друзей.

Если вы не указываете исходное значение явно, им неявно становится первый 1️⃣ элемент массива. В этом случае функция⚙️ для него уже не вызывается.

Пример​

Суммирование всех значений в массиве:​

Интерактивный редактор

function learnJavaScript()
const initialValue = 0
const sum = [1, 2, 3].reduce((accumulator, currentValue) =>
return accumulator + currentValue
>, initialValue)
return sum
>

И тоже самое в одну строчку кода:

Интерактивный редактор

function learnJavaScript()
const sum = [1, 2, 3].reduce((x, y) => x + y)
return sum
>

chaining​

Программирование на JavaScript поддерживает удобный паттерн чейнинг ( chaining ) – объединение нескольких функций⚙️ в одну цепочку с последовательной передачей результата.

Все три разобранных метода вызываются в контексте массива, а два 2️⃣ из них еще и возвращают массив. Таким образом, их очень легко объединить.

Например, посчитаем общий возраст всех мальчиков :

Интерактивный редактор

function learnJavaScript()
const friends = [
passport: '03005988', name: 'Joseph Francis Tribbiani Jr', age: 32, sex: 'm' >,
passport: '03005989', name: 'Chandler Muriel Bing', age: 33, sex: 'm' >,
passport: '03005990', name: 'Ross Eustace Geller', age: 33, sex: 'm' >,
passport: '03005991', name: 'Rachel Karen Green', age: 31, sex: 'f' >,
passport: '03005992', name: 'Monica Geller', age: 31, sex: 'f' >,
passport: '03005993', name: 'Phoebe Buffay', age: 34, sex: 'f' >
]
let totalBoysYears = friends
.filter(friend => friend.sex === 'm')
.reduce((accumulator, friend) => accumulator + friend.age, 0)
return totalBoysYears
>

Или соберем номера паспортов девочек, чтобы купить им билеты на самолет до Лас-Вегаса :

Интерактивный редактор

function learnJavaScript()
const friends = [
passport: '03005988', name: 'Joseph Francis Tribbiani Jr', age: 32, sex: 'm' >,
passport: '03005989', name: 'Chandler Muriel Bing', age: 33, sex: 'm' >,
passport: '03005990', name: 'Ross Eustace Geller', age: 33, sex: 'm' >,
passport: '03005991', name: 'Rachel Karen Green', age: 31, sex: 'f' >,
passport: '03005992', name: 'Monica Geller', age: 31, sex: 'f' >,
passport: '03005993', name: 'Phoebe Buffay', age: 34, sex: 'f' >
]
let girlsPassports = friends.filter(friend => friend.sex === 'f').map(friend => friend.passport) + ' '
return girlsPassports
>

Заключение​

С использованием этих замечательных функций⚙️ код стало читать удобнее. Итак, ниже приведен список статей, в которых более подробна рассмотрена эта тема.

EnglishMoji!

Проблемы?​

Пишите в Discord или телеграмм чат, а также подписывайтесь на наши новости

Вопросы:​

Функция, вызываемая для каждого элемента массива?

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

Результирующим значением метода reduce может выступать:

Суммирование всех значений в массиве достигается методом:

Метод, который создаёт новый массив со всеми элементами, прошедшими проверку, задаваемую в передаваемой функции:

Объединение нескольких функций в одну цепочку с последовательной передачей результата:

Для того чтобы понять, на сколько вы усвоили этот урок, пройдите тест в мобильном приложении нашей школы по этой теме или в нашем телеграм боте.

EnglishMoji!

Ссылки:​

  1. Упрости свой JavaScript – используй map, reduce и filter
  2. 15 Полезных javascript примеров map(), reduce() и filter()
  3. Array.prototype.map()
  4. Array.prototype.filter()
  5. Array.prototype.reduce()

Contributors ✨​

Thanks goes to these wonderful people (emoji key):

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *