Array基本常用API
var arr = [1, 2, 3, 'ab']
var _push = arr.push(4, 5, 6) //length=7
console.log(arr) //[ 1, 2, 3, 'ab', 4, 5, 6 ]
var _pop = arr.pop() //6
console.log(arr) //[ 1, 2, 3, 'ab', 4, 5 ]
var _shift = arr.shift() //1
console.log(arr) //[ 2, 3, 'ab', 4, 5 ]
var _unshift = arr.unshift('x') //length=6
console.log(arr) //[ 'x', 2, 3, 'ab', 4, 5 ]
var _join = arr.join('/') //x/2/3/ab/4/5 typeof _join = string
console.log(arr) //[ 'x', 2, 3, 'ab', 4, 5 ] 不改变原数组
var _slice = arr.slice(1, 2) //[2]
console.log(arr) //[ 'x', 2, 3, 'ab', 4, 5 ]
var _splice = arr.splice(3, 1, 'hello') //[ 'ab' ] 如果只有一个数组将会拆分原数组 splice(3)===['ab',4,5]
console.log(arr) //[ 'x', 2, 3, 'hello', 4, 5 ]
var _sort = arr.sort() //[ 2, 3, 4, 5, 'hello', 'x' ] 改变原数组
console.log(arr) //[ 2, 3, 4, 5, 'hello', 'x' ]
var _reverse = arr.reverse() //[ 'x', 'hello', 5, 4, 3, 2 ]
console.log(arr) //[ 'x', 'hello', 5, 4, 3, 2 ]
var _concat = arr.concat([7, 8, 9]) //[ 'x', 'hello', 5, 4, 3, 2, 7, 8, 9 ] 不改变原数组
console.log(arr) //[ 'x', 'hello', 5, 4, 3, 2 ] 这个方法会深拷贝数组
对类数组对象进行数组操作
var string = 'hello'
var a = Array.prototype.join.call(string,'-')
console.log(a) //h-e-l-l-o
var b = Array.prototype.slice.call({0:'a',1:'b',length:2}) //类数组转化数组
console.log(b) //[ 'a', 'b' ]
var person = [{name:'che',age:22 }]
Array深拷贝.concat([])
是利用拼接两个数组的方法去对数组进行深拷贝
var arr3 =[{age:1,name:'che'},{age:2,name:'cz'}]
var arr4 = arr3.concat([])
console.log(arr4)
[ { age: 1, name: 'che' }, { age: 2, name: 'cz' } ]
JSON深拷贝方法
var obj = {name:'ch',age:2}
var newObj = JSON.parse(JSON.stringify(arr5))
console.log(obj === newObj) //false
函数递归深拷贝方法
var obj = {name:'cheche',age:12,like:[1,2,{name:'xiaopei',age:20}]}
function deepCopy(obj){
var obj2 = Array.isArray(obj)?[]:{};
if(typeof obj === 'object'){
for(var key in obj){
if(typeof obj[key] === 'object'){
obj2[key] = deepCopy(obj[key])
}else{
obj2[key] = obj[key]
}
}
}
return obj2
}
var x = deepCopy(obj)
x.like[2].name = 'zhangteng'
console.log(obj) //name: 'xiaopei'
console.log(x) //name:'zhangteng'
console.log(x === obj) //false
浅拷贝
浅拷贝无法使得对象里引用数据类型不相干
var obj = {name:'ccxzc',age:20,c:function(){}}
function shallowCopy(obj){
var newObj ={}
for(var key in obj){
if(obj.hasOwnProperty(key)){
newObj[key] = obj[key]
}
}
return newObj
}
var sc = shallowCopy(obj)
console.log(sc) //{ name: 'ccxzc', age: 20, c: [Function: c] }
console.log(sc === obj) //false
reduce方法造轮子
var arr = [3, 4, 5, 6];
function reduce(arr, fn, initValue) {
// var arr2 = arr.concat([]) //利用拼接原理
// if(initValue !== undefined){
// arr2.unshift(initValue)
// }
var arr2 = (initValue !== undefined ? [] : [initValue]);
while (arr2.length > 1) {
console.log(arr2);
arr2.splice(0, 2, fn(arr2[0], arr2[1]));
}
return arr2[0];
}
var result = reduce(
arr,
function(v1, v2) {
return v1 + v2;
},
10
);
console.log(result);
将数组平面化
var arr = [1,2,3,[4,5,6],'dsa',[1,[4,5,[4,1]]]]
function flat(arr){
var newArr = []
arr.forEach((element,index) => {
if(Array.isArray(element)){
newArr = newArr.concat(flat(element))
}else{
newArr.push(element)
}
});
return newArr
}
console.log(flat(arr))
实现一个reduce函数
function reduce(arr, sum, initValue) {
var sumArr = (initValue === undefined ? [] : [initValue]).concat(arr);
console.log(sumArr)
while (sumArr.length > 1) {
sumArr.splice(0, 2, sum(sumArr[0], sumArr[1]))
console.log(sumArr)
}
return sumArr[0];
}
var x = reduce([1, 2, 3, 4],function(numberA, numberB) {
return numberA + numberB;
},10);
console.log(x);
实现 flatten([1, [2], [3, [[4]]]]) => [1, 2, 3, 4];
function flatten(arr){
var newArr = []
arr.forEach(function(e,index){
if(typeof e === 'number'){
newArr.push(e)
}else if(Array.isArray(e)){
newArr = newArr.concat(flatten(e))
}
})
return newArr
}
var x = flatten([1, [2], [3, [[4]]]])
console.log(x)









网友评论