2017-08-08 37 views
1

如何找到每個元素出現在嵌套數組中的最大次數?如何找到每個元素出現在嵌套數組中的最大次數?

我正在尋找每個元素出現在任何子陣列中的最大次數。我不是在整個嵌套數組中查找出現次數最多的元素。假設我的嵌套數組是[[2,3,5],[3,3,5],[2,3,2]。

數字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]]); 
+9

你如何獲得[2,3,5,3,2] – James

回答

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);

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);

相關問題