首页 > 解决方案 > 排序数组并按出现次数分组

问题描述

在输入

 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 ]

标签: javascriptarrays

解决方案


您可以考虑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);


推荐阅读