我创建了一个函数,用于查找带有两个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)