-
-
Save niteshpsit1/c90b3336ee639c89ae13b98825c9d9ca to your computer and use it in GitHub Desktop.
/** | |
* Sorting an array order by frequency of occurence in javascript | |
* @param {array} array An array to sort | |
* @returns {array} array of item order by frequency | |
**/ | |
function sortByFrequency(array) { | |
var frequency = {}; | |
var sortAble = []; | |
var newArr = []; | |
array.forEach(function(value) { | |
if ( value in frequency ) | |
frequency[value] = frequency[value] + 1; | |
else | |
frequency[value] = 1; | |
}); | |
for(var key in frequency){ | |
sortAble.push([key, frequency[key]]) | |
} | |
sortAble.sort(function(a, b){ | |
return b[1] - a[1] | |
}) | |
sortAble.forEach(function(obj){ | |
for(var i=0; i < obj[1]; i++){ | |
newArr.push(obj[0]); | |
} | |
}) | |
return newArr; | |
} |
Example Suppose you have an array [2, 2, 1, 4, 2,5, 4,4,4, 5] | |
sortByFrequency([2, 2, 1, 4, 2,5, 4,4,4, 5]) | |
Answer : [ '4', '4', '4', '4', '2', '2', '2', '5', '5', '1' ] | |
nishantparashar52
commented
Sep 11, 2020
•
let input = [1, 2, 3, 5, 1, 5, 1, 3, 5, 1];
let sortedArray = input.sort((a, b) => a - b);
let diff = [];
for (let i = 0; i < sortedArray.length; i++) {
diff.push({
d:
sortedArray.lastIndexOf(sortedArray[i]) -
sortedArray.indexOf(sortedArray[i]) +
1,
s: sortedArray[i],
});
i = i + sortedArray.lastIndexOf(sortedArray[i]);
}
let store = diff.sort((a, b) => (a.d < b.d ? 1 : -1));
let new1 = [];
store.forEach((el) => {
while (el.d > 0) {
// console.log(el.s);
new1.push(el.s);
el.d--;
}
});
console.log(new1);
function SortElemByFrequencyObj(arr) {
const frequency = arr.reduce((obj, curr) => {
obj[curr] = (obj[curr] || 0) + 1;
return obj;
}, {});
return Object.entries(frequency).sort((a, b) => b[1] - a[1]).flatMap(item => Array(item[1]).fill(item[0]))
}
you can make this code compact by using lodash _.count method
import _ from 'lodash';
function SortElemByFrequencyObj(arr) {
const frequency = _.count(arr);
return Object.entries(frequency).sort((a, b) => b[1] - a[1]).flatMap(item => Array(item[1]).fill(item[0]));
}