数组中出现次数最多的元素
给定一个数组,找出数组中出现次数最多的元素。
举例如下:1
var arr = [1, 3, 5, 2, 3, 9, 8];
数组arr中出现最多的次数为3,出现次数为2,所以程序最后运行结果应该输出元素3。
(1)思路:
分析题目可知,目的为找出数组中出现次数最多的元素。所以我们需要一个变量来记录数组中的每个元素,以及元素对应出现的次数。
由此联想到对象是由键值对的形式组成的,对象的属性名是唯一的。如果将数组中的元素作为属性名,那么元素出现的次数就是对应的属性值。元素出现多次时,则让相应的属性值+1。
最后再遍历对象,找出对象中属性值最大的元素(即出现次数最多),返回其对应的属性名。
(2)知识点:
for in循环通常用来遍历对象。用法为:for (var prop in obj),其中,prop为对象的属性名,obj为要遍历的对象,obj[prop]即为取出对象的属性值。
for in通常和hasOwnProperty()配合使用,意为先看prop属性是否是对象本身的(该属性不在原型上),来节约遍历成本。
(3)具体实现过程(原型链编程):1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25Object.prototype.maxTime = function () {
var obj = {},
count = 0, //记录出现次数
maxTimeNum; //记录次数最多的元素
for (var i = 0; i < this.length; i++) {
if(!obj[this[i]]) { //对象的属性值不存在,元素没有出现过
obj[this[i]] = 1;
}else {
obj[this[i]]++; //元素已经出现过,统计出现次数
}
}
for (var prop in obj) {
if(obj.hasOwnProperty(prop)) {
if(obj[prop] > count) {
count = obj[prop];
maxTimeNum = prop;
}
}
}
return '最多次数元素:' + maxTimeNum + ' 次数: ' + count;
}
var result = arr.maxTime(); //方法调用
console.log(result);
在这里,arr[i]取出数组中的每一项,obj[arr[i]]为取出对象的属性值。当取出数组中的第一个元素时,对象中没有该属性,把该元素添加到对象中,赋属性值为1。如果对象的属性值存在,则让该值+1。
最后对象遍历时会发现,如果只是简单的对属性值进行排序,可以取出最大的属性值,但是此时却无法找到对应的属性名。所以需要借助一个变量来记录属性名。
(4)输出结果:
字符串中出现次数最多的元素
字符串循环
字符串也是可以通过for循环遍历长度的。同样,str[i]也可以取出字符串中的每一位。所以遍历字符串中出现次数最多的元素时,直接改变上述方法传入的实参就可以使用。
要遍历的字符串如下:1
var str = 'abbscackbpl';
调用上述的方法,传入参数:1
2var result = str.maxTime();
console.log(result);
输出结果:
字符串拆分
相关知识点:
在数组的操作中,有一系列关于字符串和数组转换的方法,主要有以下两个:
(1)str.split()根据传入的字符将字符串拆分成数组。
举例如下:
除了上面提到的一些符号,还可以传入像逗号等特殊字符。其中,最常用的就是str.split(“”)直接将每一个字符串都拆开。
(2)str.join()与上述方法相反,这个是以什么形式将数组中的元素拼接成字符串,可以传入任意字符
基于以上,在查找字符串中出现次数最多的元素时,还有另外一种方法就是:先将字符串拆分成数组,再调用上面封装好的maxTime()方法来进行处理。
具体实现如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26var newArr = str.split('');
Object.prototype.maxTime = function () {
var obj = {},
count = 0, //记录出现次数
maxTimeNum; //记录次数最多的元素
for (var i = 0; i < this.length; i++) {
if(!obj[this[i]]) { //对象的属性值不存在,元素没有出现过
obj[this[i]] = 1;
}else {
obj[this[i]]++; //元素已经出现过,统计出现次数
}
}
for (var prop in obj) {
if(obj.hasOwnProperty(prop)) {
if(obj[prop] > count) {
count = obj[prop];
maxTimeNum = prop;
}
}
}
return '最多次数元素:' + maxTimeNum + ' 次数: ' + count;
}
var result = newArr.maxTime(); //方法调用
console.log(result);