js数据类型之数组类型二(元素查找,数组排序,循环遍历,迭代器方法及扩展)

查找元素

数组包含多种查找的函数,需要把这些函数掌握清楚,然后根据不同场景选择合适的函数。

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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值