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为空

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我和PYTHON有个约会

09.程序编程基础3~组合数据类型

python中为了方便一部分相似数据的处理,提供了各种组合类型,常见的如列表、元组 python中的列表是可变序列,元组是不可变序列

501
来自专栏Play & Scala 技术分享

Scala基础 - 下划线使用指南

2545
来自专栏python3

python 字符编码与转换

比如一款游戏《大话西游》用的是gbk编码开发的。出口到欧美国家,是无法直接运行的。

852
来自专栏上善若水

0x15Java引用赋值,是原子操作吗? 线程安全吗?

所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它的最小的执行单位,不可能有比它更小的执行单位,因此这里的原子实际是使用了物理学里的...

902
来自专栏ShaoYL

OC语言Block 续

32312
来自专栏带你撸出一手好代码

深入理解final关键字

通常我们对Java中final关键字的理解是“用final修饰的变量是不可变的”,如果尝试对final变量多次赋值,编译器将报错。似乎final的作用就是保证变...

3155
来自专栏移动开发的那些事儿

JVM内存区域与OOM

当虚拟机在执行方法testMethod的时候,这时候就会在Java虚拟机栈上创建一个栈帧,然后入栈,然而在testMethod方法内又不断的递归调用testMe...

802
来自专栏Java技术栈

Java 10 实战第 1 篇:局部变量类型推断

现在 Java 9 被遗弃了直接升级到了 Java 10,之前也发过 Java 10 新特性的文章,现在是开始实战 Java 10 的时候了。

864
来自专栏C/C++基础

C/C++编码规范

对于变成人员,良好的编程风格是提高程序可靠性和效率非常重要的手段。而编码规范就是对编程风格最好的约束保障。 严格遵守编码规范方便代码的交流和维护,利于提高代...

882
来自专栏JAVA高级架构

Java面试题合集

1.抽象类与接口的区别是什么? 一个类可以实现多个接口,但是只能继承以及抽象类。类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声...

33410

扫码关注云+社区