Является ли For ... In loop единственным вариантом для создания объекта?

Только ли цикл For-In для создания объекта со свойствами или есть лучший подход? Я хочу создать объект вместо массива.

В настоящее время он выполняет цикл data.Batch с использованием цикла for-in и выполняет некоторые общие вычисления и сопоставление свойств.

Например:

let data = {
  Batch: {
    111: { BatchId: 111, Name: "Batch 1", Count2017: 100, Count2018: 100 },
    222: { BatchId: 222, Name: "Batch 2", Count2017: 200, Count2018: 300 }
  }
};

function calculateBatch(batch) {
  mappedObject = {};
  let grandTotal = 0;

  for (const batchId in data.Batch) {
    let total = data.Batch[batchId].Count2017 + data.Batch[batchId].Count2018;

    mappedObject[batchId] = {
      BatchId: batchId,
      Name: data.Batch[batchId].Name,
      Total: total
    };

    grandTotal += total
  }

  return {
      Batch: mappedObject,
      GrandTotal: grandTotal
  }
}

console.info(calculateBatch(data.Batch));

Это лучший (самый быстрый) подход, хотя может показаться, что ваша структура данных batch может быть Array вместо Object, поскольку нет смысла иметь Ключи, если вы действительно их не используете.

vsync 16.12.2018 17:05

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

Alireza Zojaji 16.12.2018 17:07

Вы можете захотеть найти объект уменьшить

mplungjan 16.12.2018 17:08

Пфф, есть как минимум полдюжины способов создать объект.

amn 16.12.2018 17:09

Что вы определяете как «лучше»? Если было бы «быстрее», значит, быстрее всех. Если это будет самый короткий или самый большой стиль функциональное программирование, тогда есть альтернативы.

trincot 16.12.2018 17:11
в первую очередь на основе мнения: Многие хорошие вопросы порождают определенную степень мнения, основанного на опыте экспертов, но ответы на этот вопрос, как правило, почти полностью основаны на мнениях, а не на фактах, ссылках или конкретном опыте.
mplungjan 16.12.2018 17:20

Вы забыли объявить mappedObject как локальную переменную с var (или let или const)

Bergi 16.12.2018 17:22
Поведение ключевого слова "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) для оценки ваших знаний,...
1
7
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете использовать Object.keys() для получения массива имен свойств, а затем .reduce() для создания объекта результата:

return Object.keys(batch).reduce(function(result, key) {
  let total = batch[key].Count2017 + batch[key].Count2018;
  result.Batch[key] = {
    BatchID: key,
    Name: batch[key].Name,
    Total: total
  };
  result.GrandTotal += total;
  return result;
}, { Batch: {}, GrandTotal: 0 });

"Лучше" ли это, чем ваш опубликованный код, - это субъективно. Это немного короче; делает ли это более читабельным, поддерживаемым или менее? Разные люди дадут разные ответы.

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

Я не говорю о самом быстром, я говорю о ремонтопригодном и удобочитаемом.

I'll-Be-Back 16.12.2018 17:16

@ Я-вернусь, не могли бы вы указать это в вопросе? Сейчас об этом не говорится. «Лучше» может означать многое.

trincot 16.12.2018 17:17

@ Я-вернусь, конечно, это вопрос стиля, и ты должен учитывать свои собственные предпочтения.

Pointy 16.12.2018 17:17

Я бы сказал, что «легко читается» - это довольно субъективный показатель. Когда я был менее опытен в информатике в целом, для меня легко читать было все, что я мог легко понять во время чтения. Это было для циклов и изменяемого назначения и переназначения переменных. Сегодня я считаю, что примеры чисто функционального программирования легче читать и легче понимать. Забавно, это.

amn 16.12.2018 17:19

TBH, я не думаю, что reduce короче, поскольку обычно требуется дополнительный оператор return. В остальном просто разное форматирование.

Bergi 16.12.2018 17:24

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