1

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;  
                               }
          }
      
     }

3
  • 2
    flatmap and reduce. btw why is 12 count 1 Commented Jul 17, 2022 at 10:39
  • should be {"88": 1, "99": 2, "20": 1, "12": 2} Commented Jul 17, 2022 at 11:07
  • This was based on a hackerrank problem about transactions and the first two nums represented ids. In the case of a transaction between yourself or withdrawal I guess, it was only counted once. Commented Jul 18, 2022 at 5:14

2 Answers 2

1

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)

Sign up to request clarification or add additional context in comments.

Comments

0

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))

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.