Перебор и доступ к нескольким картам одновременно (JavaScript) - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть множество карт, которые имеют одинаковые ключи, но разные значения - я пытаюсь вычислить среднее значение по каждому измерению карты. Например, у меня может быть три карты, которые имеют 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]

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

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

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

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

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.log((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.log(res/3)

})
0 голосов
/ 07 сентября 2018

Использование ванильных методов 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.log( key, average );
}
0 голосов
/ 07 сентября 2018

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

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.log(averages_across)
// make a new map from this
let average_map = new Map(averages_across)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...