1

I write a code that works with letter but not with numbers I know it maybe a little complicated but this is how I could do it; with numbers it produce ordered Array and I don't know why

var orderedCount = function(text) {
  let splitted = text.split('');
  let countedLetters = splitted.reduce((AllLetters, letter) => {
    (letter in AllLetters) ? AllLetters[letter]++: AllLetters[letter] = 1;
    return AllLetters
  }, {})
  let result = Object.keys(countedLetters).map((key) => {
    return [(key), countedLetters[key]]
  })
  return result;

};
console.log(orderedCount("abracadabra")); //[['a',5], ['b',2], ['r',2], ['c',1], ['d',1]]
console.log(orderedCount("212")); //[['1',1], ['2',2]]
[['1',1],['2',2]] 

should be

[['2',2],['1',1]]
Nick
  • 118,076
  • 20
  • 42
  • 73

3 Answers3

1

You can use Object.entries to convert the object into an array and use sort to sort the element 1

var orderedCount = function(text) {
  let splitted = text.split('');
  let countedLetters = splitted.reduce((AllLetters, letter) => {
    (letter in AllLetters) ? AllLetters[letter]++: AllLetters[letter] = 1;
    return AllLetters
  }, {})

  let result = Object.entries(countedLetters).sort((a, b) => {
    return b[1] - a[1];
  })

  return result
};
console.log(orderedCount("abracadabra")); 
console.log(orderedCount("212"));

Shorter Version:

var orderedCount = function(text) {
  return Object.entries(text.split('').reduce((c, v) => {
    c[v] = (c[v] || 0) + 1;
    return c;
  }, {})).sort((a, b) => b[1] - a[1]);

};
console.log(orderedCount("abracadabra")); 
console.log(orderedCount("212"));
Eddie
  • 25,279
  • 6
  • 26
  • 53
0

You need to sort you result by count, because by default numeric keys in Object will be in ascending order

var orderedCount = function(text) {
  let splitted = text.split('');
  let countedLetters = splitted.reduce((AllLetters, letter) => {
    (letter in AllLetters) ? AllLetters[letter]++: AllLetters[letter] = 1;
    return AllLetters
  }, {})
  let result = Object.keys(countedLetters).map((key) => {
    return [(key), countedLetters[key]]
  })
  return result.sort((a,b)=>b[1] - a[1]);

};
console.log(orderedCount("abracadabra")); //[['a',5], ['b',2], ['r',2], ['c',1], ['d',1]]
console.log(orderedCount("212")); //[['1',1], ['2',2]]
Code Maniac
  • 33,907
  • 4
  • 28
  • 50
0

You can create the array directly using Array#reduce method where use a reference object which keeps object reference based on letter value.

var orderedCount = function(text) {
  const ref = {};
  return text.split('').reduce((arr, letter) => {
    (letter in ref) ? ref[letter][1]++: arr.push(ref[letter] = [letter, 1]);
    return arr;
  }, []);
};
console.log(orderedCount("abracadabra")); //[['a',5], ['b',2], ['r',2], ['c',1], ['d',1]]
console.log(orderedCount("212")); //[['1',1], ['2',2]]

Refer : Does JavaScript Guarantee Object Property Order?

Since es2015 onwards non-integer keys are kept inserting order and integer keys are sorted numerically.

Pranav C Balan
  • 106,305
  • 21
  • 136
  • 157