如何找到每个元素在嵌套数组中出现的最大次数?
我希望找到每个元素在任何子数组中出现的次数最多。我不是在寻找整个嵌套数组中出现次数最多的元素。
让我们说我的嵌套数组是[[2,3,5],[3,3,5],[2,2,3,5]]。
数字2在其中一个子阵列中出现两次。数字3在其中一个子阵列中出现两次。数字5在其中一个子阵列中出现一次。
我要找的最终结果是[2,2,3,3,5]。
最好的方法是什么?以下是我的方法,这不是很好。
function makeNewArray(arr) {
// add the # to the numbers that appear once and add the ## to the numbers that appear twice
for (var j = 0; j < arr.length; j++) {
for (var i = 0; i < arr[j].length; i++) {
if (arr[j][i] === arr[j][i+1]) {
arr[j][i] = arr[j][i] + '#';
arr[j][i+1] = arr[j][i+1] + '#';
} else {
arr[j][i] = arr[j][i] + '#';
}
}
}
// flatten the array
arr = arr.reduce(function(a, b) { return a.concat(b); });
// remove the duplicates from the array
arr = arr.filter(function(a, b) { return arr.indexOf(a) == b; });
// remove the ## and # from the array
for (var i = 0; i < arr.length; i++) {
arr[i] = parseInt(arr[i]);
}
return arr;
}
makeNewArray([[2, 3, 5], [3, 3, 5], [2, 2, 3, 5]]);
答案 0 :(得分:0)
根据您的问题,而不是您希望我没有得到的结果,这是一个可以找到最高发生次数的有效解决方案。
var a = [
[2, 3, 5],
[3, 3, 5],
[2, 2, 3, 5]
];
var o = {};
var max = 0;
var highest = null;
for (var i = 0; i < a.length; i++) {
for (var j = 0; j < a[i].length; j++) {
if (!o.hasOwnProperty(a[i][j])) {
o[a[i][j]] = 1;
} else {
o[a[i][j]]++;
}
if (o[a[i][j]] > max) {
max = o[a[i][j]];
highest = a[i][j];
}
}
}
//this is the number with the highest occurence
console.log(highest);
答案 1 :(得分:0)
此ES6解决方案迭代子数组,并创建值的映射,然后在其中将最高值移动到整个数组的映射。然后,我们将Map条目(无平移)映射到根据最高计数填充数字的新数组,并将结果展平。
var data = [[2, 3, 5], [3, 3, 5], [2, 2, 3, 5]];
var result = [].concat(... // flatten the end result
[... // convert the Map to entries array
data.reduce((r, s) => { // reduce the array into a map of counts
s.reduce((map, num) => map.set(num, (map.get(num) || 0) + 1), new Map) // get a Map of the current sub array counts
.forEach((v, k) => r.set(k, Math.max(r.get(k) || 0, v))); // update the global Map if the sub array count of a number is higher
return r;
}, new Map)]
.map((s) => Array.from({ length: s[1] }, () => s[0]))); // map the entries into new sub arrays
console.log(result);