2
let array = ['a', 'a', 'a', 'b', 'b', 'c'];

i want to group double values from array, to get result like this:

result: ['3a, 2b, c']
(or something similar)

Any idea?

neman
  • 196
  • 1
  • 10

6 Answers6

4

You can use .reduce() and .map() methods:

let array = ['a', 'a', 'a', 'b', 'b', 'c'];

let result = Object.entries(
    array.reduce((r, c) => (r[c] = (r[c] || 0) + 1, r) , {})
).map(([k, v]) => v == 1 ? k : v + k);

console.log(result);

You can also use Map if you need items in specific order:

let array = ['a', 'a', 'a', 'b', 'b', 'c'];

let result = (((arr, map) => {
    arr.forEach(s => map.set(s, (map.get(s) || 0) + 1));
    return [...map.entries()].map(([k, v]) => v == 1 ? k : v + k);
})(array, new Map()));

console.log(result);
Mohammad Usman
  • 37,952
  • 20
  • 92
  • 95
1

I would recommend using a dictionary to track the duplicate values in the array.

var dictionary = {};
for(var i = 0;i < array.length;i++){
   var value = array[i];
   if(dictionary[value] === undefined){
      dictionary[value] = 0;
   }
   dictionary[value] = dictionary[value] + 1;

}
console.log(dictionary)
nitrodmr
  • 198
  • 2
  • 8
1
function count() {
array_elements = ["a", "b", "c", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e", "a"];
array_elements.sort();
var current_elements = null;
var count= 0;
for (var i = 0; i < array_elements.length; i++) {
    if (array_elements[i] != current_elements) {
        if (cnt > 0) {
            console.log(current_elements+count);
        }
        current_elements= array_elements[i];
        count= 1;
    } else {
        count++;
    }
}
if (cnt > 0) {
    console.log(current_elements+count);
}

}

Rushikesh Pandit
  • 665
  • 5
  • 11
1

A single loop approach for simple run-length encoding (RLE) function.

let array = ['a', 'a', 'a', 'b', 'b', 'c'],
    result = array.reduce(
        (r, c, i, a) => r.concat(c === a[i - 1]
            ? ((+r.pop().slice(0, -1) || 1) + 1) + c
            : c),
        []
    );

console.log(result);
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392
0

You can use Array.reduce() to produce an object with key-value (array value and count) pairs, then Array.map() to produce an array using Object.keys().

let array = ['a', 'a', 'a', 'b', 'b', 'c'];

let countObj = array.reduce((acc, val) => (acc[val] = acc[val] ? acc[val] + 1 : 1, acc), {});

console.log(countObj);

let countArr = Object.keys(countObj).map(key => '' + countObj[key] + key);

console.log(countArr);
Angelos Chalaris
  • 6,611
  • 8
  • 49
  • 75
0

For "something similar" why not just have an object that maps letter to occurrence. You can then simply use dot notation to get the property value assigned to each key.

Here I've used reduce.

const arr = ['a', 'a', 'a', 'b', 'b', 'c'];

// `reduce` over the arr
const obj = arr.reduce((acc, c) => {

  // If the object (acc) we passed in doesn't have
  // a key assigned to the letter in the current
  // iteration (c) add it, set it to 0, then
  // add one, otherwise, if there is a key, add one
  acc[c] = (acc[c] || 0) + 1;

  // Return the object for the next iteration
  return acc;

// Pass in an initial object 
}, {});

console.log(obj);

// Grab the value of `a` property
console.log(obj.a);
Andy
  • 61,948
  • 13
  • 68
  • 95