Копировать одно поле всех объектов в массиве в одном массиве

Я хотел оптимизировать свой код, удалив for-loop.

    groupFieldNames = [];
    for (i = 0; i < data.length; i++) {
        groupFieldNames.push(data[i].groupFieldName);
    }

data — это массив объектов, каждый из которых имеет 4 поля.

Копировать одно поле всех объектов в массиве в одном массиве

Меня интересует тот, который обозначен как groupFieldName.

Есть ли способ избежать цикла и напрямую вставить поля в массив?

Обновлено:

Я согласился с предложением @Yosvel Quintero (всем ребятам, предложившим решение карты, он был первым), и проверил производительность. С массивом данных, имеющим ~ 60 тыс. объектов, у меня есть:

  • 3 мс с использованием map;
  • 11 мс с использованием for-loop

Неплохо.

Массив.прототип.карта()

Yosvel Quintero Arguelles 27.02.2019 10:52

Вместо этого вы можете использовать .map, но если вы ищете оптимальный эффективный код, мало что может превзойти цикл for...

CertainPerformance 27.02.2019 10:52

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

sjahan 27.02.2019 10:53

Не знаю ваших требований, но, возможно, вы можете сохранить полный объект, и везде, где вам нужно groupFieldName, просто используйте деструктуру объекта {groupFieldName} = obj; или в методах methodName({groupFieldName}){//}

AZ_ 27.02.2019 11:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
57
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете использовать Массив.прототип.карта()

const groupFieldNames = [];
for (i = 0; i < data.length; i++) {
    groupFieldNames.push(data[i].groupFieldName);
}

К:

const groupFieldNames = data.map(o => o.groupFieldName);

Как отметил @sjahan, это все равно считается циклом, даже если вы его не видите. Я искал что-то вроде mem-copy или что-то в этом роде. Но я вижу элегантность в том, что вы предложили.

Oiproks 27.02.2019 10:56

Здесь вы можете эффективно использовать встроенный .карта() Array следующим образом:

var data = [
	{ id: 1, groupFieldName: 'abcd' },
	{ id: 2, groupFieldName: 'pars' }
];
var groupFieldNames = data.map(obj => obj.groupFieldName)
console.info(groupFieldNames);

Вы можете использовать map

var groupFieldNames = [];
var data=[{groupFieldName:'a'},{groupFieldName:'b'},{groupFieldName:'c'}]
  console.info(data.map(x=>x.groupFieldName))

Вы также можете использовать forEach

var groupFieldNames = [];
var data=[{groupFieldName:'a'},{groupFieldName:'b'},{groupFieldName:'c'}]
data.forEach(x=>groupFieldNames.push(x.groupFieldName))
  console.info(groupFieldNames)

Вы можете использовать Array.prototype.map() с Destructuring assignment следующим образом:

const data = [
  {id: 66, groupFieldName: 'test', other: 'other'},
  {id: 66, groupFieldName: 'test2', other: 'other2'}
];

const groupFieldNames = data.map(({groupFieldName}) => groupFieldName);
console.info(groupFieldNames);

Другие вопросы по теме