查找元素
数组包含多种查找的函数,需要把这些函数掌握清楚,然后根据不同场景选择合适的函数。
indexOf
使用 indexOf 从前向后查找元素出现的位置,找到就返回该位置,如果找不到返回 -1。
let arr = [5,6,2,5,1,9];
console.log(arr.indexOf(2)); // 2 从前向后查找2出现的位置
indexOf 查找字符串找不到,因为 indexOf类似于 === 是严格类型约束。
let arr = [5,6,2,5,"1",9];
console.log(arr.indexOf(1)); // -1 indexOf 是严格类型的
第二个参数用于指定查找开始的位置
let arr = [5,6,2,5,1,9];
// 从第二个元素开始向后查找
console.log(arr.indexOf(5,1)); //3
lastIndexOf
使用 lastIndexOf 从后向前查找元素出现的位置,如果找不到返回 -1.
let arr = [5,6,2,5,1,9];
console.log(arr.lastIndexOf(6)); // 1 从后向前查找6出现的位置
// 第二个参数用于指定查找开始位置
let arr = [5,6,2,5,1,9];
console.log(arr.lastIndexOf(2,4)); //2 从索引下标为4 向前查找
includes
使用 includes 查找字符串返回值是布尔类型更方便判断
let arr = [1,9,7,5,1,3];
console.log(arr.includes(8)); // false
自己实现一个 includes 函数,加深对 includes 方法的了解
function includes(arr,item){
for(const value of arr){
if(item === value) return true;
}
return false;
}
console.log(includes([1,2,3,4,5,6],8)); //false
find
find方法找到值之后会把值返回
- 如果找不到返回值为 undefined
返回第一次找到的值,不继续查找
let arr=["cht" , 'hw' ,'xfj'];
let find = arr.find((item)=> {
return item =='hw';
})
console.log(find); // hw
使用 includes 等不能查找引用类型,因为他们的内存地址是不相等的
const user = [ {name:"cht"} , {name:"hw"} , {name:"xfj"}];
const res = user.includes({name : "hw"});
console.log(res); // false
find 可以方便的查找引用类型
const user = [ {name:"cht"} , {name:"hw"} , {name:"xfj"}];
const find = user.find(function(user) {
return user.name="hw";
});
console.log(find);
findIndex
findIndex 与 find 的区别是返回索引值,参数也是;当前值,索引,操作数组。
- 查找不到返回 -1
let arr = [5,1,3,"9",1,2,7];
console.log(arr.findIndex((num) => {
return num == 9;
})) // 3
find 原理
let arr = [1,2,3,4,5];
function find(array,callback) {
for(const value of array) {
if(callback(value) === true) return value;
}
return undefined;
}
let res = find(arr,function(item) {
return item == 2;
})
console.log(res);
添加原型方法实现
let arr = [1,2,3,4,5];
Array.prototype.findValue = function(callback) {
for(const value of this) {
if(callback(value) === true) return value;
}
return undefined;
}
let res = arr.findValue(function(item) {
return item==2;
})
console.log(res);
数组排序
reverse 反转数组顺序
let arr = [9,8,7,6,5,4];
console.log(arr.reverse()); // [4,5,6,7,8,9]
sort
sort 每次使用两个值进行比价 Array.sort(a,b) =>a-b
let arr = [15,84,65,32,98,78];
console.log(arr.sort((a,b)=> {
return a-b;
})); // [15, 32, 65, 78, 84, 98]
排序原理
let arr = [15,84,65,32,98,78] ;
function sort(array,callback) {
for(const n in array) {
for(const m in array) {
if(callback(array[n],array[m]) < 0) {
let temp = array[n];
array[n] = array[m];
array[m] = temp;
}
}
}
return array;
}
console.log(sort(arr,function(a,b){
return a-b;
}))
数组循环遍历
for 根据数组长度结合 for 循环来遍历数组
let arr = [
{name:"cht" ,age:15},
{name:"hw" ,age:16},
{name:"xfj" ,age:17}
]
for(let i=0;i<arr.length;i++) {
arr[i] = `我叫${arr[i].name}今年${arr[i].age}` ;
}
console.log(arr);
forEach
forEach 使函数作用在每个数组元素上,但是没有返回值。
let obj = [
{name:"cht" ,age:15},
{name:"hw" ,age:16},
{name:"xfj" ,age:17}
];
obj.forEach((item,index,array)=> {
item.name = item.name.substr(0,1);
});
console.log(obj);
//{name:'c',age:15}
//{name:"h" ,age:16},
//{name:"x" ,age:17}
for/in
遍历时的 key 值为数组索引
let obj = [
{name:"cht" ,age:15},
{name:"hw" ,age:16},
{name:"xfj" ,age:17}
];
for(const key in obj) {
console.log(key); // 0 1 2
console.log(obj[key]); // 整个对象
console.log(`名字${obj[key].name}`);
}
for/of
于 for/in 不同的是 for/of 每次循环取其中的值而不是索引。
let obj = [
{name:"cht" ,age:15},
{name:"hw" ,age:16},
{name:"xfj" ,age:17}
]
for( const item of obj) {
console.log(item);
console.log(item.name);
console.log(item.age);
}
取数组中的最大值
let arr = [75,95,35,26,14,15];
function maxValue(array) {
let max = array[0];
for( const val of array) {
max = max>val?max:val;
}
return max;
}
console.log(maxValue(arr)); // 95
迭代器方法
keys
通过迭代对象获取索引
```javascript
const arr = ['cht' , 'hw'];
const keys = arr.keys();
console.log(keys.next());//{value: 0, done: false}
console.log(keys.next());//{value: 1, done: false}
获取数组所有键
```javascript
let arr = ["cht" , "hw" , "xfj"];
for(const key of arr.keys()) {
console.log(key); // 0,1,2
}
values
通过迭代对象获取值
const arr = ['cht' , 'hw'];
const values = arr.values();
console.log(values.next()); //{value: "cht", done: false}
console.log(values.next()); //{value: "hw", done: false}
console.log(values.next()); // {value: undefined, done: true}
获取数组的所有值
const arr = ['a','b','c'];
for(const value of arr.values()){
console.log(value); // a,b,c
}
entries
返回所有数组所有键值对,j解构语法
const arr = ['a','b','c'];
for(const [key,value] of arr.entries()) {
console.log(key,value);
}
//0 "a"
//1 "b"
//2 "c"
扩展方法
every
every 用于递归检测元素,要所有元素操作都要返回真结果才为真。查看同学成绩是否都及格。
const user =[
{name:"A",test:50},
{name:"B",test:90},
{name:"C",test:78},
];
const res = user.every(function(user){
user.js>=60;
})
console.log(res); // false
标题的关键词检查
let words = ["A" ,"B" , "C"];
let title = '我是A';
let is = words.every(function(item,index,array){
return title.indexOf(item) >-1;
});
console.log(is); // false
some
使用 some 函数可以递归的检测元素,如果有一个返回true,表达式结果就是真。第一个参数为元素,第二个参数为索引,第三个参数为原数组。
下面是使用 some 检测规则关键词的示例。
let words = ['A', 'B','C'];
let title = '我身上有一个字母B';
let is = words.some(function(item,index,array){
return title.indexOf(item) > -1;
});
console.log(is); // true
filter
使用 filter 可以过滤数组中元素。
获取所有title
let obj = [
{ title:'孙悟空',type:'P' },
{ title:'蜘蛛侠' ,type:'C'},
{ title: '钢铁侠', type:'C'}
];
let objTitle = obj.filter(function(item,index,array){
if(item.type.toLowerCase() == 'c') {
return true;
}
});
console.log(objTitle); // 返回
过滤方法:
function except(array,except) {
const newArray =[];
for(const ele of array) {
if(!except.includes(ele)) newArray.push(ele);
return newArray;
}
}
const array = [1,2,3,4];
console.log(array,[2,3]);
map
使用map 映射可以在数组的所有元素上应用函数,用于映射新的值。
获取数组所有标题组合的新数组
let obj = [
{ title:'孙悟空',type:'P' },
{ title:'蜘蛛侠' ,type:'C'},
{ title: '钢铁侠', type:'C'}
];
console.log(obj.map(item => item.title));
为所有title加上A
let obj = [
{ title:'孙悟空',type:'P' },
{ title:'蜘蛛侠' ,type:'C'},
{ title: '钢铁侠', type:'C'}
];
obj = obj.map(function(item,index,array) {
item.title = `A ${item.title}`;
return item;
})
console.log(obj);