首页 > 代码库 > 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中的数组