使用while循环查找JS数组中最频繁的项



我创建了一个函数,用于查找带有两个for循环的JS数组中最频繁的项,并显示该项以及数组中的次数。我怎样才能用while循环来完成它?

var arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];
//ta = times appeared / m = max / arrchar = array character
var ta = 1;
var m = 0;
var arrchar;
for (var i = 0; i < arr.length; i++) {
for (var j = i; j < arr.length; j++) {
if (arr[i] == arr[j])
m++;
if (ta < m) {
ta = m;
arrchar = arr[i];
}
}
m = 0;
}
console.log(arrchar + "(" + ta + ")");

使用while循环的目的是使用退出条件。由于没有退出条件,我基本上创建了一个相当有效的for循环算法,并用while循环替换了for循环。

var arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];
var occurences = {};
var max = 0;
var champion;
var index = 0;
while (index < arr.length) {
var item = arr[index];
occurences[item] = (occurences[item] || 0) + 1;
if (occurences[item] > max) {
max = occurences[item];
champion = item;
}
index += 1;
}
console.log(`${champion} has ${max} occurences`);

不幸的是,上面的代码总是将3"3"视为相同的值。如果你不希望发生这种情况,那么你应该使用地图。

var arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];
var occurences = new Map();
var max = 0;
var champion;
var index = 0;
while (index < arr.length) {
var item = arr[index];
var newSize = (occurences.get(item) || 0) + 1;
occurences.set(item, newSize);
if (newSize > max) {
max = newSize;
champion = item;
}
index += 1;
}
console.log(`${champion} has ${max} occurences`);

您可以将filter方法与while循环一起使用。为每个arr索引创建一个筛选数组。如果已筛选数组的长度大于maxOccurrence,请将已筛选阵列的长度设置为maxOccurence。您可以尝试其他数组原型方法。也许有一个更简单的方法。

var arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];
var char = "";
var maxOccurence = 0;
var i = 0;
while(i < arr.length){
var filteredArr = arr.filter(x=> x === arr[i]);
if(filteredArr.length > maxOccurence){
char = arr[i];
maxOccurence = filteredArr.length;
}
i++;
}
console.log(char + "(" + maxOccurence + ")");

运行以下代码。它会给你带来你最期待的结果。

const arr=[3,'a','a'',2,3,'a',3,'a'',2,4,9,3];

// result array
var result = [];
$.each(arr, function( index, value ) {
if(result[value] === undefined) 
result[value] = 1;
else
result[value] = result[value] + 1;
});
console.log(result);

您可以使用数组缩减器:

const arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];
let max, winner;
const arrReduce = arr.reduce((acc, curr, index) => {
acc[curr] = acc[curr] ? acc[curr] += 1 : 1;
if(max < acc[curr]) winner = curr
max = max > acc[curr] ? max : acc[curr];
return acc;
}, {});
console.log(max, winner)

最新更新