javascript - 按出现次数排列数组和分组

标签 javascript arrays

关于

的输入
 array = [ 1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20 ]

输出会是这样的

 [ [ 1, 1, 1, 1 ], [ 2, 2, 2 ], 4, 5, 10, [ 20, 20 ], 391, 392, 591 ]

尝试了以下函数来创建结果:

var array = [ 1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20]

function answer(ArrayFromAbove) {
  var length = array.length;
  for (var i = 0; i < length; i++) {
    for (var j = 0; j < (length - i - 1); j++) {
      if (array[j] > array[j + 1]) {
        var tmp = array[j];
        array[j] = array[j + 1];
        array[j + 1] = tmp;

      }
    }
  }
}
answer(array);
console.log(array);

应该返回:

[ [ 1, 1, 1, 1 ], [ 2, 2, 2 ], 4, 5, 10, [ 20, 20 ], 391, 392, 591 ]

最佳答案

您可能会考虑使用 reduce 来代替,计算每个数字的出现次数,然后迭代排序的条目并将值推送到结果数组(作为数组,如果有多个值,或者只是一个普通数字,如果只有一个):

const input = [1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20];
/* create an object like:
{
  "1": 4,
  "2": 3,
  "4": 1,
  "5": 1,
  "10": 1,
  "20": 2,
  "391": 1,
  "392": 1,
  "591": 1
} */
const inputCounts = input.reduce((a, num) => {
  a[num] = (a[num] || 0) + 1;
  return a;
}, {});

const output = Object.entries(inputCounts)
  // turn (string) key to number:
  .map(([key, val]) => [Number(key), val])
  .sort((a, b) => a[0] - b[0])
  .reduce((a, [num, count]) => {
    a.push(
      count === 1
      ? num
      : new Array(count).fill(num)
    );
    return a;
  }, []);
console.log(output);

关于javascript - 按出现次数排列数组和分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54643793/

相关文章:

javascript - 验证 JavaScript 代码而不强制执行特定样式

javascript - 操作 setTimeout 函数中由先前 setTimeout 函数创建的对象

java - 是否可以避免在 split() 或 Arrays.asList() 中将一种对象类型转换为另一种对象类型的循环?

c++ - 替代数组表示

C++ 数组作为参数,编辑 : now includes variable scoping

java - 我如何计算我的代码的平均值

javascript - 如何查找具有特定不同值对的对象数组中的值之和?

javascript - 独特的多列排序angular js

javascript - 如何拦截和修改任何对象的特定属性

javascript - 如何使用导出按钮对数据表中的按钮进行分组?