如何在嵌套数组中找到每个元素出现次数最多的次数?

时间:2017-08-08 17:52:37

标签: javascript arrays

如何找到每个元素在嵌套数组中出现的最大次数?

我希望找到每个元素在任何子数组中出现的次数最多。我不是在寻找整个嵌套数组中出现次数最多的元素。

让我们说我的嵌套数组是[[2,3,5],[3,3,5],[2,2,3,5]]。

数字2在其中一个子阵列中出现两次。数字3在其中一个子阵列中出现两次。数字5在其中一个子阵列中出现一次。

我要找的最终结果是[2,2,3,3,5]。

最好的方法是什么?以下是我的方法,这不是很好。

function makeNewArray(arr) {

    // add the # to the numbers that appear once and add the ## to the numbers that appear twice
    for (var j = 0; j < arr.length; j++) {
        for (var i = 0; i < arr[j].length; i++) {
          if (arr[j][i] === arr[j][i+1]) {
            arr[j][i] = arr[j][i] + '#';
            arr[j][i+1] = arr[j][i+1] + '#';    
          } else {
            arr[j][i] = arr[j][i] + '#';
          }     
      }
    }   

    // flatten the array
    arr = arr.reduce(function(a, b) { return a.concat(b); });

    // remove the duplicates from the array
    arr = arr.filter(function(a, b) { return arr.indexOf(a) == b; });

    // remove the ## and # from the array 
    for (var i = 0; i < arr.length; i++) {
    arr[i] = parseInt(arr[i]);
    }

    return arr;
}

makeNewArray([[2, 3, 5], [3, 3, 5], [2, 2, 3, 5]]);

2 个答案:

答案 0 :(得分:0)

根据您的问题,而不是您希望我没有得到的结果,这是一个可以找到最高发生次数的有效解决方案。

var a = [
  [2, 3, 5],
  [3, 3, 5],
  [2, 2, 3, 5]
];
var o = {};
var max = 0;
var highest = null;
for (var i = 0; i < a.length; i++) {
  for (var j = 0; j < a[i].length; j++) {
    if (!o.hasOwnProperty(a[i][j])) {
      o[a[i][j]] = 1;
    } else {
      o[a[i][j]]++;
    }
    if (o[a[i][j]] > max) {
      max = o[a[i][j]];
      highest = a[i][j];
    }
  }
}
//this is the number with the highest occurence
console.log(highest);

答案 1 :(得分:0)

此ES6解决方案迭代子数组,并创建值的映射,然后在其中将最高值移动到整个数组的映射。然后,我们将Map条目(无平移)映射到根据最高计数填充数字的新数组,并将结果展平。

var data = [[2, 3, 5], [3, 3, 5], [2, 2, 3, 5]];

var result = [].concat(... // flatten the end result
  [... // convert the Map to entries array
    data.reduce((r, s) => { // reduce the array into a map of counts
      s.reduce((map, num) => map.set(num, (map.get(num) || 0) + 1), new Map) // get a Map of the current sub array counts
      .forEach((v, k) => r.set(k, Math.max(r.get(k) || 0, v))); // update the global Map if the sub array count of a number is higher
  return r;
}, new Map)]
  .map((s) => Array.from({ length: s[1] }, () => s[0]))); // map the entries into new sub arrays

console.log(result);