js基础系列(一):数组相关
一,常用数组方法
1-1 arr.map()
此方法是将数组中的每个元素调用一个提供的函数,结果作为一个新的数组返回,并没有改变原来的数组
let arr = [1, 2, 3, 4, 5]
let newArr = arr.map(x => x*2)
console.log(arr); //arr= [1, 2, 3, 4, 5] 原数组保持不变
console.log(newArr); //newArr = [2, 4, 6, 8, 10] 返回新数组
1-2 arr.forEach()
此方法是将数组中的每个元素执行传进提供的函数,没有返回值,直接改变原数组,注意和map方法区分
let arr = [1, 2, 3, 4, 5]
num.forEach(x => x*2)
// arr = [2, 4, 6, 8, 10] 数组改变,注意和map区分
1-3 arr.filter()
此方法是将所有元素进行判断,将满足条件的元素作为一个新的数组返回
let arr = [1, 2, 3, 4, 5]
let isBigEnough => value => value >= 3
let newArr = arr.filter(isBigEnough )
//newNum = [3, 4, 5] 满足条件的元素返回为一个新的数组
1-4 arr.push(new)
此方法是在数组的后面添加新加元素,此方法改变了数组的长度
let arr = [1,2]
arr.push(3)
console.log(arr) //[1,2,3x]
1-5 arr.pop()
此方法在数组后面删除最后一个元素,并返回数组,此方法改变了数组的长度:
let arr = [1, 2, 3, 4, 5]
arr.pop()
console.log(arr) //[1, 2, 3, 4]
console.log(arr.length) //4
1-6 arr.shift()
此方法在数组后面删除第一个元素,并返回数组,此方法改变了数组的长度
let arr = [1, 2, 3, 4, 5]
arr.shift()
console.log(arr) //[2, 3, 4, 5]
console.log(arr.length) //4
1-7 arr.unshift()
此方法是将一个或多个元素添加到数组的开头,并返回新数组的长度
let arr = [1, 2, 3, 4, 5]
arr.unshift(6, 7)
console.log(arr) //[6, 7, 2, 3, 4, 5]
console.log(arr.length) //7
1-8 arr.isArray()
判断一个对象是不是数组,返回的是布尔值
let arr = [1,2]
Array.isArray(arr) // true
1-9 arr.concat()
此方法是一个可以将多个数组拼接成一个数组
let arr1 = [1, 2, 3],
arr2 = [4, 5]
let arr = arr1.concat(arr2)
console.log(arr)//[1, 2, 3, 4, 5]
1-10 arr.toString()
此方法将数组转化为字符串
let arr = [1, 2, 3, 4, 5];
let str = arr.toString()
console.log(str)// 1,2,3,4,5
let str1 = arr.toString()
let str2 = arr.toString(',')
let str3 = arr.toString('##')
console.log(str1)// 12345
console.log(str2)// 1,2,3,4,5
console.log(str3)// 1##2##3##4##5
1-11 arr.join()
此方法也是将数组转化为字符串
let arr = [1, 2, 3, 4, 5];
arr.join('-') //1-2-3-4-5
1-12 arr.splice(开始位置, 删除的个数,元素)
万能方法,可以实现增删改,然后返回被删除的项目。。注意:该方法会改变原始数组
//1.新增元素
let a = [1, 2, 3, 4, 5];
let a1 = a.splice(2, 0, 'haha')
console.log(a) //[1, 2, 'haha', 3, 4, 5]新增一个元素
console.log(a1) //[] 返回被删除的项目
// 2.删除元素
let b = [1, 2, 3, 4, 5];
let b1 = b.splice(2, 3)
console.log(b); // [1,2]
console.log(b1) //[3, 4, 5]
// 3.替换元素
let c = [1, 2, 3, 4, 5];
let c1 = c.splice(2, 1,'haha')
console.log(c); // [ 1, 2, 'haha', 4, 5 ]
console.log(c1) //[3]
1-13 arr.slice()
splice() 方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素。如果从 arrayObject 中删除了元素,则返回的是含有被删除的元素的数组。splice() 方法会直接对数组进行修改。
let arr = [1,2,3,4,5,6]
let newArr = arr.slice(1,2)
console.log(newArr); //[ 2 ]
console.log(arr); //[ 1, 2, 3, 4, 5, 6 ]
##1-14 arr.sort()
按照 Unicode code 位置排序,默认升序
let arr = [21,12,3,4,5,6]
arr.sort()
console.log(arr); //[21,12,3,4,5,6]
- 升序
let arr = [21,12,3,44,5,6]
arr.sort((a,b)=>{
return a-b
})
console.log(arr); //[ 3, 5, 6, 12, 21, 44 ]
- 降序
let arr = [21,12,3,44,5,6]
arr.sort((a,b)=>{
return b-a
})
console.log(arr); //[ 44, 21, 12, 6, 5, 3 ]
##1-15 arr.reverse()
reverse() 方法用于颠倒数组中元素的顺序。返回的是颠倒后的数组,会改变原数组。
let arr = [21,12,3,44,5,6]
arr.reverse()
console.log(arr); //[ 6, 5, 44, 3, 12, 21 ]
1-16 indexOf 和 lastIndexOf
都是查找数组元素 出现的位置。都接受两个参数:查找的值、查找起始位置
不存在,返回 -1 ;存在,返回位置。indexOf 是从前往后查找, lastIndexOf 是从后往前查找。
let arr = [21,12,3,44,5,6]
console.log(arr.indexOf(12)); //1
二,es6新增的数组操作
2-1 reduce()
语法
arr.reduce(function(prev,cur,index,arr){
...
}, init);
arr 表示原数组;
prev 表示上一次调用回调时的返回值,或者初始值 init;
cur 表示当前正在处理的数组元素;
index 表示当前正在处理的数组元素的索引,若提供 init 值,则索引为0,否则索引为1;
init 表示初始值。
2-1-1 数组求和
let arr = [1,2,3,1,2]
getSum = (all,now) => {
return all + now
}
let sum = arr.reduce(getSum)
console.log(`sum=${sum}`); // sum=9
2-1-2 数组求最大值
let arr = [1,2,3,1,2]
getMax = (a,b) => {
return Math.max(a,b)
}
let max = arr.reduce(getMax)
console.log(`max=${max}`); // max=3
2-1-3 数组去重
let arr = [1,2,3,1,2]
getOnlyOne = (total,cur) => {
total.indexOf(cur) === -1 && total.push(cur)
return total
}
let newArr = arr.reduce(getOnlyOne,[])
console.log(newArr); // [1,2,3]
2-2 arr.every()
定义和用法
every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供)。
every() 方法使用指定函数检测数组中的所有元素:
- 如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。
- 如果所有元素都满足条件,则返回 true。
注意: every() 不会对空数组进行检测。
注意: every() 不会改变原始数组。
- 语法
语法:array.every(function(item,index,array){
//item:当前元素的值;
//index:当前元素的索引;
// array:当前元素的数组对象;
})
- 用法
let a = [1,2,3,4].every((item)=>{return item > 5})
console.log(a) // false
let b = [1,2,3,4].every((item)=>{return item > 2})
console.log(b) // false
let c = [1,2,3,4].every((item)=>{return item >= 1})
console.log(c) // true
2-3 arr.some()
定义和用法
some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。
some() 方法会依次执行数组的每个元素:
- 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
- 如果没有满足条件的元素,则返回false。
注意: some() 不会对空数组进行检测。
注意: some() 不会改变原始数组。
- 语法
语法:array.some(function(item,index,array){
//item:当前元素的值;
//index:当前元素的索引;
// array:当前元素的数组对象;
})
- 用法
let a = [1,2,3,4].some((item)=>{return item>5})
console.log(a) // false
let b = [1,2,3,4].some((item)=>{return item<2})
console.log(b) // true
let c = [1,2,3,4].some((item)=>{return item<1})
console.log(c) // false
##2-4 arr.filfter()
定义和用法
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
注意: filter() 不会对空数组进行检测。
注意: filter() 不会改变原始数组。
let arr = [21,12,3,44,5,6]
let a = arr.filter((item)=>{
return item > 10
})
console.log(a); //[ 21, 12, 44 ]
console.log(arr); //[ 21, 12, 3, 44, 5, 6 ]
2-5 arr.map()
定义和用法
map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。
注意: map() 不会对空数组进行检测。
注意: map() 不会改变原始数组。返回每次函数调用的结果组成一个新数组
语法
array.map(function(currentValue,index,arr), thisValue)
- currentValue 必须。当前元素的值
- index 可选。当前元素的索引值
- arr 可选。当前元素属于的数组对象
用法
let arr = [21,12,3,44,5,6]
let a = arr.map((item)=>{
return item > 10
})
console.log(a); //[ true, true, false, true, false, false ]
console.log(arr); //[ 21, 12, 3, 44, 5, 6 ]
2-6 arr.find()
定义和用法
find() 方法返回通过测试(函数内判断)的数组的第一个元素的值。
find() 方法为数组中的每个元素都调用一次函数执行:
- 当数组中的元素在测试条件时返回 true 时, find() 返回符合条件的元素,之后的值不会再调用执行函数。
- 如果没有符合条件的元素返回 undefined
注意: find() 对于空数组,函数是不会执行的。
注意: find() 并没有改变数组的原始值。
语法
array.find(function(currentValue, index, arr),thisValue)
- currentValue 必须。当前元素的值
- index 可选。当前元素的索引值
- arr 可选。当前元素属于的数组对象
用法
let arr = [4,22,3,44,5,6]
let a = arr.find((item)=>{
return item > 10
})
console.log(a); //2
console.log(arr); //[ 4, 22, 3, 44, 5, 6 ]
2-7 arr.findIndex()
定义和用法
findIndex() 方法返回传入一个测试条件(函数)符合条件的数组第一个元素位置。
findIndex() 方法为数组中的每个元素都调用一次函数执行:
- 当数组中的元素在测试条件时返回 true 时, findIndex() 返回符合条件的元素的索引位置,之后的值不会再调用执行函数。
- 如果没有符合条件的元素返回 -1
注意: findIndex() 对于空数组,函数是不会执行的。
注意: findIndex() 并没有改变数组的原始值。
语法
array.findIndex(function(currentValue, index, arr), thisValue)
用法
let arr = [4,22,3,44,5,6]
let a = arr.findIndex((item)=>{
return item > 10
})
console.log(a); //1
console.log(arr); //[ 4, 22, 3, 44, 5, 6 ]
2-8 arr.entries()
entries() 方法返回一个数组的迭代对象,该对象包含数组的键值对 (key/value)。
迭代对象中数组的索引值作为 key, 数组元素作为 value。
let arr = ["Banana", "Orange", "Apple", "Mango"];
for(let item of arr.entries()){
console.log(item);
}
/*
[ 0, 'Banana' ]
[ 1, 'Orange' ]
[ 2, 'Apple' ]
[ 3, 'Mango' ]
*/
2-9 arr.values()
返回迭代器:返回键值对的value。(对比参考arr.entries())
let arr = ["Banana", "Orange", "Apple", "Mango"];
for(let item of arr.values()){
console.log(item);
}
/**
Banana
Orange
Apple
Mango
*/
2-10 arr.keys()
keys() 方法用于从数组创建一个包含数组键的可迭代对象。
如果对象是数组返回 true,否则返回 false。
let arr = ["Banana", "Orange", "Apple", "Mango"];
for(let item of arr.keys()){
console.log(item);
}
/**
0
1
2
3
*/
三.数组去重
主要介绍数组中包含对象的时候需要做去重处理的方法
1-1.reduce
var arr = [
{ name: "张三", num: "1" },
{ name: "李四", num: "11" },
{ name: "王五", num: "12" },
{ name: "张三", num: "13" },
{ name: "李四", num: "1" },
{ name: "王五", num: "12" }
]
/**
*
* @param {*} arr 需要去重的原数组
* @param {*} name 去重字段
* @return 去重之后的新数组
*/
function arrayUnique2(arr, name) {
var hash = {};
return arr.reduce(function (item, next) {
hash[next[name]] ? '' : hash[next[name]] = true && item.push(next);
return item;
}, []);
}
arrayUnique2(arr, "name");
/** [ { name: '张三', num: '1' },
{ name: '李四', num: '11' },
{ name: '王五', num: '12' } ] **/
1-2 for循环
借助对象访问属性的方法,判断属性是否存在,如果已存在则进行过滤
var arr = [
{ name: "张三", num: "1" },
{ name: "李四", num: "11" },
{ name: "王五", num: "12" },
{ name: "张三", num: "13" },
{ name: "李四", num: "1" },
{ name: "王五", num: "12" }
]
function deleteSameItemInArray (targetArr,itemName=''){
let obj = {},result=[]
targetArr.forEach((item,i)=>{
if(!obj[item[itemName]]){
obj[item[itemName]] = true
result.push(item)
}
})
return result
}
let resultArr = deleteSameItemInArray(arr2,'name')
console.log(resultArr);