Итерация и одновременный доступ к нескольким картам (JavaScript)

У меня есть множество карт с одинаковыми ключами, но разными значениями - я пытаюсь вычислить среднее значение по каждому измерению карты. Например, у меня может быть три карты с 3 ключами - это число может меняться, как и количество ключей.

var a = new Map ([["wordOne", 153], ["wordTwo", 24], ["wordThree", 73]]);
var b = new Map ([["wordOne", 346], ["wordTwo", 693], ["wordThree", 124]]);
var c = new Map ([["wordOne", 34], ["wordTwo", 4352], ["wordThree", 93]]);

Я пытаюсь воспроизвести приведенное ниже уравнение, поэтому я могу получить Средняя стоимость для этого ключа из 3 различных карт, которые я выбрал.

[(a_1 + b_1 + c_1)/3]
[(a_2 + b_2 + c_2)/3]
[(a_3 + b_3 + c_3)/3]

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

Как я могу создать цикл for в JavaScript, который выполняет итерацию по выбранным картам и выполняет уравнение усреднения для каждого значения для выбранных карт и сохраняет его на новой карте с теми же ключами?

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

Nina Scholz 07.09.2018 18:58

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

JimmyNeedles 07.09.2018 19:03

ок, тогда откуда взять a_99?

Nina Scholz 07.09.2018 19:05

Это просто пример, который показывает карту со 100 элементами ... Мои карты содержат тысячи элементов

JimmyNeedles 07.09.2018 19:09

@JimmyNeedles в вашем примере неясно, взят ли a_99 из карты со 100 значениями или из первого значения 100-й карты. В вашем примере создается впечатление, что вам нужен массив средних значений каждой отдельной карты. Другими словами: похоже, что [(a_1 + b_1 + c_1)/3] должен быть средним значением mapOne, но вы описываете нечто иное.

Mark 07.09.2018 19:12

Ваш вопрос довольно непонятен, чего вы хотите добиться. имеет ли a какое-то отношение к первой карте, а b - ко второй, или обозначает ключ для карты, как в mapOne, и так далее. пожалуйста, добавьте пример с короткими данными и тем, что вы хотите получить.

Nina Scholz 07.09.2018 19:12

Ага, извините, ребята - согласен. Я отредактировал вопрос, чтобы было понятнее. Следует отметить, что я буду использовать не только 3 карты, иногда это будут 2,4, 5, 6 и т. д.

JimmyNeedles 07.09.2018 19:18

Если вы говорите о Картах, почему в приведенных вами примерах нет единой Карты?

Jonas Wilms 07.09.2018 19:19

хм. ........ ..? В самом деле?

Nina Scholz 07.09.2018 19:21

То, что вы описываете, больше похоже на (a_1 + a_2 + a_3)/3, а не на (a_1 + b_1 + c_1)/3. Было бы действительно проще, если бы вы просто разместили то, с чего начинаете, и окончательный желаемый результат.

Mark 07.09.2018 19:22

Нет, я хочу правильно. Я просто плохо объясняю - перефразирую вопрос

JimmyNeedles 07.09.2018 19:30

если мы не знаем, что такое a или b, 0 и 1, это могло быть все. а сами карты не приводятся. просто какой-то размер карт ... но как связаны данные? через ключ? Если это так, вам нужно получить ключи от одной карты и получить доступ ко всем другим картам с ее помощью.

Nina Scholz 07.09.2018 19:30

См. Отредактированный вопрос.

JimmyNeedles 07.09.2018 19:45
Поведение ключевого слова "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
13
619
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Чтобы получить среднее значение каждого ключа, вы можете сначала поместить все карты в один массив. Это позволит перебирать их. Затем получите список всех ключей одной из карт и повторите его. Это предполагает, что все карты имеют одинаковые ключи.

var a = new Map ([["wordOne", 153], ["wordTwo", 24], ["wordThree", 73]]);
var b = new Map ([["wordOne", 346], ["wordTwo", 693], ["wordThree", 124]]);
var c = new Map ([["wordOne", 34], ["wordTwo", 4352], ["wordThree", 93]]);
// make array of maps
let maps = [a, b, c];

// Average of each key across maps (i.e [average_a, average_b, average_c])
// map over all keys(), then average across the maps
let averages_across = [...maps[0].keys()].map(key => [key, maps.reduce((sum, map) => sum + map.get(key), 0)/maps.length])

console.info(averages_across)
// make a new map from this
let average_map = new Map(averages_across)

что с точками перед maps[0]? [...maps[0].keys()].map(key => [key, maps.reduce((sum, map) => sum + map.get(key), 0)/maps.length]);

JimmyNeedles 07.09.2018 20:35

Привет, @JimmyNeedles, keys() возвращает итератор, а не массив, а у итераторов нет функции map(). Итак, [...maps[0].keys] берет итератор из keys() и распространять помещает его в массив, который затем можно вызвать map().

Mark 07.09.2018 20:40

Хорошо, интересно. Сегодня впервые наткнулся на ...

JimmyNeedles 07.09.2018 20:47

Я не уверен, что понимаю, но доступ к каждому значению каждого ключа на каждой итерации может быть одним из следующих:

var mapOne = new Map ([["a", 153], ["b", 24], ["c", 73]]);
var mapTwo = new Map ([["a", 346], ["b", 693], ["c", 124]]);
var mapThree = new Map ([["a", 34], ["b", 4352], ["c", 93]]);

//each key of all maps in each iteration. a+a+a/3 b+b+b/3... etc
mapThree.forEach((v,k)=>{

    console.info((mapOne.get(k)+mapTwo.get(k)+v)/3)

});


//the average of each map
[...[mapOne],...[mapTwo],...[mapThree]].forEach(m=>{

    var res = 0;

    mapThree.forEach((v,k)=>{// a+b+c/3 ... etc
    
        res += mapOne.get(k);
    
    })
    
    console.info(res/3)

})

Использование ванильных методов JavaScript и Map.

var mapOne = new Map ([ ["a", 153], ["b", 24], ["c", 73] ]);
var mapTwo = new Map ([ ["a", 346], ["b", 693], ["c", 124] ]);
var mapThree = new Map ([ ["a", 34], ["b", 4352], ["c", 93] ]);

function averageValuesKeyMaps ( ...maps )
{
  // Map for key => averages
  const averagesMap = new Map ();

  let 
    // Get the first map as a reference,
    mapRef = maps[ 0 ],
    // Get the size, assuming that each map is the same size
    size = mapRef.size,
    // Get the keys, assuming that every maps have those keys
    keys = maps[ 0 ].keys()

  // For each key in keys 
  for ( let key of keys )
  {
    // Get the average with each value of the current key for each map
    let average = maps.reduce( ( acc, map ) => acc + map.get( key ), 0 ) / size;
    
    // Set the key => average
    averagesMap.set( key, average );
  }

  // Return the new map of averages
  return averagesMap;
}

// Get the map of averages key values
let averagesMap = averageValuesKeyMaps( mapOne, mapTwo, mapThree );

// Usage example
for ( let [ key, average ] of averagesMap.entries() )
{ 
  // Do something with key or average
  console.info( key, average );
}

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