数组方法
增加和删除元素
—>[] unshift() []<— push()
<—[] **shift()** []—> pop()
这里要注意的是,unshift
和shift
相比于push
和pop
的时间复杂度会更高,push和unshift都可以一次增加多个数字进数组,而pop和shift只能弹出一个数组里的元素
splice(pos, deleteCount, elem1, ..., elemN
)
splice(位置 , 删除的个数, 并在当前位置插入的值),splice()不返回新数组,直接在原数组上操作
arr.splice(str)
方法可以说是处理数组的瑞士军刀。它可以做所有事情:添加,删除和插入元素
slice(start, end
)
slice()会返回一个新的数组,所以平时可以用于对数组的备份操作,还用于类数组转数组
concat(arg1, arg2…)
concat()会创建一个新数组,其中包含来自于其他数组和其他项的值,它接受任意数量的参数 —— 数组或值都可以,结果是一个包含来自于 arr
,然后是 arg1
,arg2
的元素的新数组。
如果参数 argN
是一个数组,那么其中的所有元素都会被复制。否则,将复制参数本身。
搜索元素
indexOf(item, from)
从索引 from
开始搜索 item
,如果找到则返回索引,否则返回 -1
。
lastIndexOf(item, from)
跟上面一样,只是搜索位置从后面开始
includes(item, from)
从索引 from
开始搜索 item
,如果找到则返回 true
(译注:如果没找到,则返回 false
)。
find(function(){})
find() 方法返回满足提供的测试函数的数组中第一个元素的值。
find() 方法执行一次为每一个数组索引回调函数:
如果找到函数返回true值的数组元素,则**find()**立即返回找到的元素的值
否则,它返回undefined,表明没有元素通过测试
注意: find()方法不会更改原始数组。
例如,我们有一个存储用户的数组,每个用户都有 id
和 name
字段。让我们找到 id == 1
的那个用户:
let users = [
{id: 1, name: "John"},
{id: 2, name: "Pete"},
{id: 3, name: "Mary"}
];
let user = users.find(item => item.id == 1); //user ===> {id: 1, name: "John"}
alert(user.name); // John
findIndex(function(){})
和find的方法基本是一样的,也要以一个回调函数作为方法去数组里查找元素,但它返回找到元素的索引,而不是元素本身。并且在未找到任何内容时返回 -1
。
filter(function(){})
和find的方法基本是一样的,但是find适用于条件只有一个,只返回一个值的,而filter()适用于条件是一个范围的,返回的值也是所有匹配元素组成的数组。
例如:
let users = [
{id: 1, name: "John"},
{id: 2, name: "Pete"},
{id: 3, name: "Mary"}
];
// 返回前两个用户的数组
let someUsers = users.filter(item => item.id < 3);
//someUsers ===> [ {id: 1, name: "John"}, {id: 2, name: "Pete"}]
alert(someUsers.length); // 2
转换数组
大致意思是,从一个数组通过一些回调函数对数组元素的执行从而返回另一个数组
map(function(){})
它对数组的每个元素都调用函数,并返回结果数组。
例如,在这里我们将每个元素转换为它的字符串长度:
let lengths = ["Bilbo", "Gandalf", "Nazgul"].map(item => item.length);
alert(lengths); // 5,7,6
sort(function(){})
首先,都知道他是一个排序的方法,但是这个方法中,sort()本身不是重点,重点是他里面的回调函数
let arr = [ 1, 2, 15 ];
// 该方法重新排列 arr 的内容
arr.sort();
alert( arr ); // 1, 15, 2
你有没有注意到结果有什么奇怪的地方?
顺序变成了 1, 15, 2
。不对,但为什么呢?
这些元素默认情况下被按字符串进行排序。
从字面上看,所有元素都被转换为字符串,然后进行比较。对于字符串,按照词典顺序进行排序,实际上应该是 "2" > "15"
。
要使用我们自己的排序顺序,我们需要提供一个函数作为 arr.sort()
的参数
注意!!!作为sort的回调函数必须有两个参数
let arr = [ 1, 2, 15 ];
// 该方法重新排列 arr 的内容
arr.sort((a,b) => return a - b); //1)当返回值为负数时,那么a的数放在前面
//2)当返回值为正数时,那么b的数放在前面
//3)当返回值为0时,不动
alert( arr ); // 1,2,15
数组去重
//排序前去重
function demo(arr){
const demoarr = [];
var i = 0
for(let item of arr){
if(demoarr[item]){
continue;
}
demoarr[i++] = item;
}
console.log(demoarr);
}
demo(arr);
//排序后去重
const uniarr = [];
const n = Symbol('unique')
function demo1(arr){
arr.sort((a,b) => a-b )
arr.reduce(function(acc,item){
if(acc !== item ){
uniarr.push(item)
}
return item;
},n)
return uniarr;
}
demo1(arr);
reserve()
arr.reverse()
方法用于颠倒 arr
中元素的顺序,它也会**返回颠倒后的数组 arr
**。
split(delim)
str.split(delim)方法可以做到。它通过给定的分隔符 delim
将字符串分割成一个数组
主要用于将字符串转成数组形式
const a = "javascript"
const b = a.split("")
console.log(b) //["j", "a", "v", "a", "s", "c", "r", "i", "p", "t"]
join(gule)
arr.join(glue)与 split
相反,它会在它们之间创建一串由 glue
粘合的 arr
项,是把数组转成字符串的形式
例如:
let arr = ['Bilbo', 'Gandalf', 'Nazgul'];
let str = arr.join(';'); // 使用分号 ; 将数组粘合成字符串
alert( str ); // Bilbo;Gandalf;Nazgul
reduce(function(){})
当我们需要遍历一个数组时 —— 我们可以使用 forEach
,for
或 for..of
。
当我们需要遍历并返回每个元素的数据时 —— 我们可以使用 map
。
arr.reduce()方法和上面的种类差不多,但稍微复杂一点。它们用于根据数组计算单个值。
例如:
在这里,我们通过一行代码得到一个数组的总和:
let arr = [1, 2, 3, 4, 5];
let result = arr.reduce((sum, current) => sum + current, 0);
//1) 先把0赋给sum
//2) 执行完sum+current之后把结果赋给sum,current去取数组下一个值
//3) 重复这个过程
alert(result); // 15
该函数一个接一个地应用于所有数组元素,并将其结果“搬运(carry on)”到下一个调用。
应用函数时,上一个函数调用的结果将作为第一个参数传递给下一个函数。
因此,第一个参数本质上是累加器,用于存储所有先前执行的组合结果。最后,它成为result的结果。
遍历数组
forEach(function(){})
这个方法能让数组里每一个数组都执行一个回调函数,但是不同于上面一些方法的是,forEach()不会返回值。
例如,下面这个程序显示了数组的每个元素:
// 对每个元素调用 alert
["Bilbo", "Gandalf", "Nazgul"].forEach(alert);
那么,如果给forEach里面return有用嘛?
在forEach中用return不会返回,函数会继续执行。
let nums = [1, 2, 3];
nums.forEach((item, index) => {
return;//无效
})
中断遍历的方法:
- 使用try监视代码块,在需要中断的地方抛出异常。
- 官方推荐方法(替换方法):用every和some替代forEach函数。every在碰到return false的时候,中止循环。some在碰到return ture的时候,中止循环