创建一个索引数组,该数组的索引值为 JavaScript 中最常见的数组值

Create an array of indexes of the most common value of an array in JavaScript

本文关键字:数组 JavaScript 索引值 常见 一个 创建 索引      更新时间:2023-09-26

如何创建数组中最常见值的索引数组(应排除空字符串)。我的数组大小总是三,这应该可以简化问题,但我还没有找到解决这个问题的方法。我使用的是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]

可以使用reduce函数和过滤函数

//["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>

这有效:

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