js小题目(持续更新)

总是感觉之前做过的问题很久没碰的话就会忘掉,于是打算专门开一个记录小题目的随笔当题典用。

目录

五种主要数据类型进行值复制
数组去重
数组去重并计数


实现clone()方法,对五种主要数据类型进行值复制

Object、Array、Boolean、Number、String

分为三种情况:普通变量,Array,Object

因为array和object里也可能包含引用类型,所以递归调用

function clone(obj){
    var copy;
    if(obj instanceof Array){
        copy=[];//用空数组来一个一个接收数据
        obj.forEach(function(value,index){
            copy[index] = clone(obj[index]);
        })
        return copy;
    }else if(obj instanceof Object){
        copy = {};//用空对象来一个一个接收数据
        for(var i in obj){
            copy[i]=clone(obj[i]);
        }
        return copy;
    }else{//值类型直接赋值
        return obj;
    }
}

数组去重

Array.prototype.delRepeat = function() {
    var res = [];//创建一个新的数组存放结果
    var json = {};//创建一个空对象
    for(var i = 0; i < this.length; i++) {//每次从原数组中取出一个元素,然后到对象中去访问这个属性,如果能访问到值,则说明重复
        if(!json[this[i]]) {
		res.push(this[i]);
		json[this[i]] = 1;
	    }
    }
    return res;
}

var arr = [12, 13, 3, 'haha', 13, 12, 4, 'haha', 'hi', 'hihi'];
alert(arr.delRepeat());

不过这样有个很大的问题,就是字符串 '123' 和 数值123 会被当作相同元素被跳过。

于是可以做如下的修改:

Array.prototype.delRepeat = function() {
    var res = [];//创建一个新的数组存放结果
    var json = {};//创建一个空对象
    var strFlag = '';//判断是否为字符串的标记
    for(var i = 0; i < this.length; i++) {//每次从原数组中取出一个元素,然后到对象中去访问这个属性,如果能访问到值,则说明重复
        if(typeof this[i] == 'string' ) {  
            strFlag = 'str_';  
        } else {  
            strFlag = '';  
        } 
        if(!json[strFlag+this[i]]) {
	    res.push(this[i]);
	    json[strFlag+this[i]] = 1;
        }
    }
    return res;
}

var arr = [12, 13, 3, 'haha', 13, '12', 4, 'haha', 'hi', 'hihi'];
alert(arr.delRepeat());

数组去重并计数

统计数组["番茄炒蛋","泡椒牛柳","香干肉丝","番茄炒蛋","香干肉丝","蜜汁鸡腿"]中各个菜的个数。

function test(arr) {
    var hash = {};
    var str = arr.toString();
    str.replace(/[\u4E00-\u9FA5\uF900-\uFA2D]+/g, function($1) {//正则是匹配中文(包括了中日韩文)
    if($1 in hash)
        hash[$1]++;
    else
        hash[$1] = 1;
    });
    return hash;
}
var arr = ["番茄炒蛋","泡椒牛柳","香干肉丝","番茄炒蛋","香干肉丝","蜜汁鸡腿"];
console.log(test(arr));

具体的匹配中文及字符方法:/[\u4E00-\u9FA5\uF900-\uFA2D]/
说明:
u4e00-u9fbf : unicode CJK(中日韩)统一表意字符。u9fa5后至u9fbf为空
uF900-uFAFF : 为unicode CJK 兼容象形文字 。uFA2D后至uFAFF为空

posted @ 2017-03-16 14:17  无所事事者爱嘲笑  阅读(334)  评论(0编辑  收藏  举报