2016-01-20 90 views
2

如何創建數組最常見值的索引數組(應排除空字符串)。我的數組總是大小三,這應該簡化問題,但我還沒有找到解決這個問題的方法。我正在使用JavaScript(ES5),因此無法訪問Set。在JavaScript中創建數組最常見值的索引數組

E.g.下面都會返回一個空數組(考慮 「」 爲空字符串):

[" ", " ", " "] => [] 
["a", " ", " "] => [] 
[" ", "b", " "] => [] 
[" ", " ", "c"] => [] 
["a", "b", " "] => [] 
[" ", "b", "c"] => [] 
["a", " ", "c"] => [] 
["a", "b", "c"] => [] 

及以下內容將返回:

["a", "a", " "] => [0, 1] 
["a", "a", "c"] => [0, 1] 
[" ", "b", "b"] => [1, 2] 
["a", "b", "b"] => [1, 2] 
["c", " ", "c"] => [0, 2] 
["c", "b", "c"] => [0, 2] 
["c", "c", "c"] => [0, 1, 2] 
+0

類似:http://stackoverflow.com/questions/28077040/return-values-from-array-and-occurences-by-frequency –

+0

你介意解釋左右數組之間有什麼區別? – AGE

+1

@AGE,左值 - 右 - 索引 – Grundy

回答

0

這工作:

function myFunc(arr){ 
 
     var copy = arr.slice(0), val, j; 
 
     var buffer = []; 
 

 
     for(i=0; i<3; i++){ 
 
      val = arr[i]; 
 
      if(val == '' || val == ' '){ 
 
      continue; 
 
      }else{ 
 
      delete copy[i]; 
 
      if((j = copy.indexOf(val)) != -1){ 
 
       if(buffer.indexOf(i) == -1) buffer.push(i); 
 
       buffer.push(j); 
 
      } 
 
      } 
 
     } 
 

 
     document.body.innerHTML = JSON.stringify(arr) + ' => ' + JSON.stringify(buffer); 
 
     
 
     return buffer; 
 
    } 
 

 
myFunc(["c", "a", "a"]);

+0

謝謝,效果很好。其他答案也很好,但這似乎是最簡單的。 – Gabriel

3

您可以使用reduce functionfilter function

//["c", "b", "c"] => [0, 2] 
 
var arr = ["c", "b", "c"]; 
 

 
function a(arr) { 
 

 
    var result = arr.reduce(function(acc, cur, index) { 
 
    if(cur == ' ' || cur == '') return acc; // skip if value - empty string 
 
    if (!acc.map[cur]) { // if new value 
 
     acc.map[cur] = [index]; // add index to map 
 
     acc.result.push(acc.map[cur]);//add index to result array 
 
    } else { 
 
     acc.map[cur].push(index); // push index to result array 
 
    } 
 
    return acc; 
 
    }, { 
 
    map: {}, 
 
    result: [] 
 
    }).result.filter(function(el){ // get arrays only with length greater than 1 
 
    return el.length > 1; 
 
    }) 
 
    .reduce(function(acc, cur) { // get array with max length 
 
    return acc.length > cur.length ? acc : cur; 
 
    },[]); 
 
    document.getElementById('r').innerHTML += JSON.stringify(arr) + ' => ' + JSON.stringify(result) + '<br />'; 
 
} 
 

 
a([" ", " ", " "]); 
 
a(["a", " ", " "]); 
 
a([" ", "b", " "]); 
 
a([" ", " ", "c"]); 
 
a(["a", "b", " "]); 
 
a([" ", "b", "c"]); 
 
a(["a", " ", "c"]); 
 
a(["a", "b", "c"]); 
 

 
a(["a", "a", " "]); 
 
a(["a", "a", "c"]); 
 
a([" ", "b", "b"]); 
 
a(["a", "b", "b"]); 
 
a(["c", " ", "c"]); 
 
a(["c", "b", "c"]); 
 
a(["c", "c", "c"]);
<div id='r'></div>