总是感觉之前做过的问题很久没碰的话就会忘掉,于是打算专门开一个记录小题目的随笔当题典用。
目录
实现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为空