方案一
使用一个对象来记录值出现的次数,再对该对象处理,找出次数最多的一项
//"prop"是值,"num"是出现次数
var arr3 = [2, 3, 4, 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, 2, 3, 5, 2, 5, 2, 5, 3, 2, 3, 4]
var obj = {}//统计值出现的次数{1:次数,2:次数,3:次数...}
var obj2 = {}//最终结果,prop是数组中的值,num出现的次数的记录
for (item in arr3) {
if (obj[arr3[item]] == undefined) {//第一次出现的值,计数为1
obj[arr3[item]] = 1
} else {
obj[arr3[item]]++
}
}
console.log(obj)//{1: 2, 2: 5, 3: 12, 4: 2, 5: 3}
//从obj1的初步结果中比较出最终结果{prop: "3", num: 12}
for (item in obj) {
if (obj2["prop"] == undefined) {//第一次向obj2中填值
obj2["prop"] = item
obj2["num"] = obj[item]
} else {
if (obj2["num"] < obj[item]) {//比较次数,将次数大的项赋值到obj2
obj2["prop"] = item
obj2["num"] = obj[item]
}
}
console.log(obj2)
// {prop: "1", num: 2}
// {prop: "2", num: 5}
// {prop: "3", num: 12}
// {prop: "3", num: 12}
// {prop: "3", num: 12}
}
方案二
使用数组方法filter:1.每次删除掉第一次出现的新数字,如(1,2,3,2,3,3,3)会删除掉(1,2,3)变为(2,3,3,3);2.循环操作,直到数组内只有一种值,如(3,3),停止操作
硬用filter的,复杂了,且没有记录每种值出现的次数,改变了原数组,老脸一红
var arr3 = [2, 3, 4, 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, 2, 3, 5, 2, 5, 2, 5, 3, 2, 3, 4]
var flag = false//用于判断数组内只有一种值
var flagcount = 0//计数组内有几种不同的值
while (!flag) {
flagcount = 0//新一轮循环,计数清0
if (arr3.length == 1) {//如果数组长度为1了,直接跳出
break;
}
//生成过滤后的数组,操作如下
//对flag的说明:每次新的一圈循环开始,flag设置为true,当发现数组中包含不同大小的值,则设为false,预示着还会进入下一次循环
arr3 = arr3.filter((ele, index, self) => {
if (flagcount == 0) {//因为第一次进入设置flag为true
flag = true
}
if (flagcount >= 2) {//通过flagcount发现数组中包含不同大小的值,则设为false
flag = false
}
if (self.indexOf(ele) != index) {
return true
} else {//累计数组中有多少种值
flagcount++;
return false
}
})
console.log(arr3)
}
/**
输出结果
(19) [3, 1, 3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 5, 2, 5, 3, 2, 3, 4]
(14) [3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 5, 3, 2, 3]
(11) [3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 3]
(9) [3, 3, 3, 3, 3, 3, 3, 2, 3]
(7) [3, 3, 3, 3, 3, 3, 3]
(6) [3, 3, 3, 3, 3, 3]
*/