首页 > 代码库 > js中的数组
js中的数组
准备写一系列的文章记录做题的同时,与学习到的知识融汇贯通,没事的时候可以拿出来看看。
1.题目:查找数组元素位置
输入:[ 1, 2, 3, 4 ], 3
返回 位置,如果没有找到返回-1
思路:最开始想到的就是for循环之后判断是否有这个数值,这也证明了基础相当的不牢靠,js中有相关的方法indexOf,直接拿arr.indexOf(item)就能直接返回位置。
高程3中(95页),记录了两个方法,indexOf()和lastIndexOf(),他们都是接受两个参数,要查找的数组和查找起点的位置,一个从开始算,一个从最后开始算,没有找到返回-1.题目中是全局查找,所以,第二个参数可以不填(查找起点的位置)。
一个栗子:
var arr = [1,2,3,4,5]; arr.indexOf(2); arr.indexOf(7) //返回 1 //返回 -1
也可以使用forEach循环来解题。
关于forEach(96页),迭代[dié dài]方法中记录了5个方法。他们都接受两个参数,1需要运行的函数方法,2运行这些函数的作用域对象(表示this指向,个人理解,this指向的当前的作用域,如果没有会向上找),然后就是函数啦。运行的函数方法接受三个参数:1.数组中的所有值(相当于for循环中的【i】每一个数组的值,这样理解),2.数组中的位置,3.数组本身,知道了具体使用方法,看看他们的兄弟,以及他们的方法。
every():简单的说就是对数组进行判断,如果数组中的值与我们设定的条件都满足,那么就会返回true。
栗子:
var arr = [1,2,3,4,5]; var items = arr.every(function(item,index,arr){ //item表示每一个数组里面的值 return item > 2 }) console.log(items) //返回false ,因为里面有两个返回false,1 2 都是小于等于2
//如果数组中有一个为空,还是会返回 true
//没有值 [1,2,3,‘‘,5],undefind,‘xxx‘字符串,设定条件为大于0,就会返回false
filter():这个就是把数组中的值进行判断,如果这些值有些返回true的话,那么就返回true的集合(array);通常用来进行过滤。
栗子:
var arr = [1,2,3,4,5]; var items = arr.filter(function(item,index,arr){ return item > 2 }) console.log(items) //返回 [3,4,5]
//数组有空或者没有值,undefined,‘xxx’,就会直接忽略
//如:[1,2,3,,5],[1,2,3,‘‘,5]
//打印返回 [1,2,3,5]
forEach():原话是对数组中的每一项运行给定函数,方法没有返回值。简单点,就是这数组的每一个值都会被一个function方法过一遍,function的中方法自定义,返回也自定义,是最自由的一个方法。参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
栗子:
var arr = [1,2,3,4,5]; var num = []; arr.forEach(function(item,index,arr){ if(item > 2){ num.push(item) } }) console.log(num) //返回 [3,4,5]
// 需要注意的是,它只接受数值,
//undefined,空,或者没有值返回也是不一样的
1,2,3,,5,直接打印返回[1,2,3,5]
1,2,3,‘‘,5 返回 [1,2,3,,5]
1,2,3,undedined,5 返回 [1,2,3,undefined,5]
map():改方法与forEach差不多,但是它是有返回值的,返回调用方法结果值的数组。
栗子:
var arr = [1,2,3,4,5] var items = arr.map(function(item,index,arr){ return item *2 }) console.log(items) //返回 [2, 4, 6, 8, 10]
//[1,,3,4,5] 返回 [2, undefined × 1, 6, 8, 10]
//[1,‘‘,3,4,5] 返回 [2, 0, 6, 8, 10]
//[1,‘xx‘,3,4,5] 返回 [2, NaN, 6, 8, 10]
//[1,undefined,3,4,5] 返回 [2, NaN, 6, 8, 10]
some:():方法同上,只是如果与设定的判断中有一个是true,那么就返回true
栗子:
var arr = [1,2,3,4] var items = arr.some(function(item,index,arr){ return item>3 }) console.log(items) //返回 true
//传啥只要一个返回ture 就返回 true 省心!!!
上面几种遍历数组的方式都不能修改原数组的。需要变量来存储。
其实,在写这些方法的时候,我又想到几个方法来解这个问题。
1.那么先看every方法,pass,只返回true或false,无法拓展
2.fllter,过滤这个方法,是可以不过需要借助indexOf
demo:
//我们传入的值 var num = 1; var arr = [1,2,3,4,5]; var items = arr.filter(function (item,index,arr) { if(item === num){ console.log(arr.indexOf(num)) return arr.indexOf(num); }else{ console.log(-1); return -1; } }) //返回 0 //返回 4个 -1 这不是我们希望的结果
修改了一下,参考了别人的代码
var num = 2; var fa = -1; var arr = [1,2,3,4,5]; var items = arr.filter(function (item,index,arr) { if(item === num && fa === -1){ fa = index }else{ return -1 } console.log(fa) })
只返回一个位置,num=2,返回1,跟我们的结果一样。
那么,forEach,map也是同样的可以用这种方法进行判断。
不过还是要用js自带的indexOf方法,不是因为别的,写的太多,不够装逼啊!!!
js中的数组