JS 小练习
数组深度拷贝
在JS中,对于对象类型的变量的引用是通过类似C之类的“指针”的方式来操作的,及如果多个变量引用同一个对象,则任意一个变量对对象的操作都会影响到其它的变量。因此如果要创建一个与已经存在的对象内容相同的对象,不能通过简单的赋值操作。
var a=[1,2,3,4];
var b=a;
a.pop();
alert(a); //弹出1,2,3
alert(b); //弹出1,2,3
方法一 (性能低)
Array.prototype.clone = function(){
var a=[];
for (var i = 0, l = this.length; i < l; i++) {
a.push(this[i]);
return a;
}
}
方法二
Array.prototype.clone = function() {
return this.slice(0);
}
方法三
Array.prototype.clone = function() {
return [].concat(this);
} //或者 Array.prototype.clone=function(){ return this.concat(); }
对象深度克隆
function cloneObject(obj) {
var o = obj.constructor === Array ? [] : {};
for (var i in obj) {
if ( obj.hasOwnProperty(i) ) {
o[i] = typeof obj[i] === "object" ? cloneObject(obj[i]) : obj[i];
}
}
return o;
}
数组拍平
1、递归
var result = []
function unfold(arr){
for(var i=0;i< arr.length;i++){
if(typeof arr[i]=="object" && arr[i].length>1) {
unfold(arr[i]);
} else {
result.push(arr[i]);
}
}
}
var arr = [1,3,4,5,[6,[0,1,5],9],[2,5,[1,5]],[5]];
unfold(arr)
2、使用tostring
var c=[1,3,4,5,[6,[0,1,5],9],[2,5,[1,5]],[5]];
var b = c.toString().split(',')
3、使用es6的reduce函数
var arr=[1,3,4,5,[6,[0,1,5],9],[2,5,[1,5]],[5]];
const flatten = arr => arr.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []);
var result = flatten(arr);