Home > Software design >  Convert array of strings to hashmap with count javascript
Convert array of strings to hashmap with count javascript

Time:07-17

Is there a better way to convert

["88 99", "20 99", "12 12"]

to a hashmap in the form

{"88": 1, "99": 2, "20": 1, "12": 1}

Using map or reduce?

Where in this case, a string with duplicate numbers only gets increases it's count by 1.

Currently I'm converting the above array into a 2d array using .split(' ') and iterating over that 2d array in another for loop as so:

var counts = {}
    for (let i = 0; i < logs.length; i  ){
      let ack = logs[i].split(' ');
      if(ack[0]==ack[1]){
        counts[ack[0]] = counts[ack[0]] ? counts[ack[0]]   1 : 1; 
      }
      else{
      for(let j= 0; j < 2; j  ){
         counts[ack[j]] = counts[ack[j]] ? counts[ack[j]]   1 : 1;  
                               }
          }
      
     }

CodePudding user response:

Yes. I'm assuming you want to write in a functional style, so I'm not worrying about efficiency, etc.

You can collapse this into a hairy one-liner but I wrote the intermediate steps and output them for illustration.

const input = ["88 99", "20 99", "12 12"];

const split = input.map( (string) => string.split(" ") );
console.log("split: "   JSON.stringify(split));

const flattened = split.reduce( (acc,array) => acc = acc.concat(array), []);
console.log("flattened: "   JSON.stringify(flattened));

const output = flattened.reduce( (byKey, item) => {
    if (!byKey[item]) byKey[item] = 0;
    byKey[item]  ;
    return byKey;
}, {});
console.log(JSON.stringify(output))

CodePudding user response:

First I group by numbers, summing the appearances of each. This is using the reduce part. That's it. I used adaption of method by https://stackoverflow.com/a/62031473/3807365

var arr = ["88 99", "20 99", "12 12"]

var step1 = arr.reduce(function(agg, pair) {
  pair.split(" ").forEach(function(item) {
    agg[item] = (agg[item] || 0)   1
  })
  return agg;
}, {})

console.log(step1)

  • Related