javascript - 从数组中返回排序后的唯一值,但如果计数相等,则按顺序返回值

标签 javascript arrays sorting unique

我正在创建一个函数,它接受一个未排序的整数数组并返回一个按频率排序的唯一整数数组。但是,如果整数具有相同的频率,它们将按输入数组的原始顺序返回。这是我当前的功能:

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/

相关文章:

javascript - 如何为 Amazon SES sendRawEmail 创建邮件正文

javascript - Javascript 获取所有选定选项的结果

javascript - iTextSharp : Javascript in PDF not firing when filled in in vb. 网络

javascript - 如何使用 javascript 提交 ajax drupal 表单

java - 在java中填充一个二维数组

python - 在日期列表中查找最近的过去日期

mysql - SQL按两列进行复杂排序

java - 如何根据参数之一对数据结构进行不同的排序?

javascript - 如何删除条形图中的填充? (图表.JS)

python - 使用 numba 中的数组索引数组 (njit) : variable-dimension ndarrays