2016-01-20 3 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 function и filter 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>

Смежные вопросы