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