2017-08-08 4 views
1

ネストされた配列で各要素が最大回数検出される方法を教えてください。ネストされた配列で各要素が最大回数検出される方法を教えてください。

私は、各要素がサブアレイのいずれかで発生する回数の最大数を見つけるために探しています。私は入れ子配列全体で最も多く発生する要素を探しているわけではありません。

のは、私のネストされた配列は、[[2、3、5]、[3、3、5]、[2、2、3、5]。あるとしましょう

番号2は、サブアレイの1つに2回表示されます。番号3は、サブアレイの1つに2回現れる。サブアレイの1つに番号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溶液は、アレイ全体のマップに最高値を移動させ、その後に、サブアレイを反復し、そして値のマップを作成します。その後、マップエントリ(意図しないパンを意味する)を、それらの最高カウントに従って数字で満たされた新しいアレイにマッピングし、結果を平坦化する。

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

関連する問題