我正在创建一个函数,它接受一个未排序的整数数组并返回一个按频率排序的唯一整数数组。但是,如果整数具有相同的频率,它们将按输入数组的原始顺序返回。这是我当前的功能:
function uniqueUnionSorted(arr) {
counter = {};
for(var i=0; i<arr.length; i++) {
if (arr[i] in counter) {
counter[arr[i]] ++;
} else {
counter[arr[i]] = 1;
}
}
sortedStrings = Object.keys(counter).sort(function(a,b) {
return counter[b] - counter[a]
});
var sortedNumbers = sortedStrings.map(Number);
return sortedNumbers;
}
所以对于这样的数组:
arr = [1, 3, 2, 1, 5, 2, 1, 4]
函数应该返回:
[1,2,3,5,4]
但是,我的函数正在对 5 和 4 进行排序并返回:
[1,2,3,4,5]
请帮忙!
最佳答案
这种重新排序的原因是当使用 Object.keys()
时,数字对象属性将按顺序排列。
不要将 counter
定义为对象,而是使用 Map
,它将保留插入顺序:
function uniqueUnionSorted(arr) {
var counter = new Map();
for(var i=0; i<arr.length; i++) {
counter.set(arr[i], (counter.get(arr[i]) || 0) + 1);
}
// Spreading the Map will produce an array of pairs
var sortedNumbers = [...counter].sort(function(a,b) {
return b[1] - a[1]; // sort by count
}).map(a => a[0]); // only keep the values, not the counts
return sortedNumbers; // Map keys retain original type, so they remain numeric
}
arr = [1, 3, 2, 1, 5, 2, 1, 4]
console.log(uniqueUnionSorted(arr));
关于javascript - 从数组中返回排序后的唯一值,但如果计数相等,则按顺序返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45199832/