【问题标题】:Create an array of indexes of the most common value of an array in JavaScript在 JavaScript 中创建数组最常见值的索引数组
【发布时间】:2016-01-20 16:53:08
【问题描述】:

如何创建数组中最常见值的索引数组(应排除空字符串)。我的数组总是大小为 3,这应该可以简化问题,但我还没有找到解决这个问题的方法。我使用的是 JavaScript (ES5),所以无法访问 Set。

例如以下都将返回一个空数组(将“”视为空字符串):

[" ", " ", " "] => []
["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]

【问题讨论】:

标签: javascript arrays


【解决方案1】:

您可以使用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"]);
&lt;div id='r'&gt;&lt;/div&gt;

【讨论】:

    【解决方案2】:

    这行得通:

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

    【讨论】:

    • 谢谢,效果很好。其他答案也不错,但这个似乎是最简单的。
    猜你喜欢
    • 2023-03-30
    • 2015-08-18
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 2016-06-23
    • 1970-01-01
    相关资源
    最近更新 更多