Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[JS]常用的数组API总结 #23

Open
cookiepool opened this issue Nov 22, 2019 · 0 comments
Open

[JS]常用的数组API总结 #23

cookiepool opened this issue Nov 22, 2019 · 0 comments
Labels
JavaScript JS相关的东西

Comments

@cookiepool
Copy link
Owner

cookiepool commented Nov 22, 2019

forEach()

forEach() 方法对数组的每个元素执行一次提供的函数。

  • 该循环不能使用break结束,同时return语句也仅是结束本次循环,要结束循环必须使用try...catch抛出一个异常,不推荐这么做。
  • 该api无返回值,所以无法链式调用。
// 直接上代码
let arr = ['lee', 26, 'male', true, undefined];
arr.forEach((value, index, arrSelf) => {
    console.log(value, index);
}) 
// 关于thisArg直接搬了MDN上的例子
function Counter() {
    this.sum = 0;
    this.count = 0;
}

Counter.prototype.add = function(array) {
    array.forEach(function(entry) {
        this.sum += entry;
        ++this.count;
    }, this);
    //console.log(this);
};

var obj = new Counter();
obj.add([1, 3, 5, 7]);

obj.count; 
// 4 === (1+1+1+1)
obj.sum;
// 16 === (1+3+5+7)

map()

map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。

  • 该方法不会修改原数组,有返回值,返回的是你在回调函数里面执行的操作过后的数据。
  • 这个方法不要做过滤处理,过滤处理请使用filter()。
let arr = [2, 4, 6, 8];
let newarr = arr.map((value, index, arrSelf) => {
    return value * 2;
})
console.log(newarr); // [4, 8, 12, 16]

filter()

filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。

  • 该方法不会修改原数组,有返回值,返回的是你在回调函数里面执行的筛选过后的数据。
let arr = [2, 4, 6, 8];
let newarr = arr.filter((value, index, arrSelf) => {
    return value > 4;
})
console.log(newarr); // [6, 8]

some()

some() 方法测试数组中是不是至少有1个元素通过了被提供的函数测试。它返回的是一个Boolean类型的值。数组中有至少一个元素通过回调函数的测试就会返回true;所有元素都没有通过回调函数的测试返回值才会为false。

  • 如果用一个空数组进行测试,在任何情况下它返回的都是false。
  • 该方法不会修改原数组,有返回值,返回值为布尔值。
  • 只要你的判断有一个满足了条件,就直接返回true了,后面的不会再执行。
let arr = [2, 4, 6, 8];
let newarr = arr.some((value, index, arrSelf) => {
    console.log(value); // 输出:2 4 6
    return value > 4;
})
console.log(newarr);  // true

every()

这个方法功能跟some()相反,every() 方法测试一个数组内的所有元素是否都能通过某个指定函数的测试。它返回一个布尔值。如果回调函数的每一次返回都为真值,返回 true ,否则返回 false。

  • 若收到一个空数组,此方法在一切情况下都会返回 true。
  • 该方法不会修改原数组,有返回值,返回值为布尔值。
  • 只要你的判断有一个满足不了条件,就直接返回false了,后面的不会再执行。
let arr = [2, 4, 6, 8];
let newarr = arr.every((value, index, arrSelf) => {
    console.log(value); // 输出:2
    return value > 3;
})
console.log(newarr); // false

reduce()

reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。不一定在数学意义上的叠加计算,这里叠加指:可以利用前遍历操作的结果到下一次遍历使用,重复叠加使用下去。

  • 不修改原数组,返回新的数组。
  • arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])

accumulator 累计器
currentValue 当前值
currentIndex 当前索引
array 数组

  • 回调函数第一次执行时,accumulator 和currentValue的取值有两种情况:如果调用reduce()时提供了initialValue,accumulator取值为initialValue,currentValue取数组中的第一个值;如果没有提供 initialValue,那么accumulator取数组中的第一个值,currentValue取数组中的第二个值。
  • 在没有初始值的空数组上调用 reduce 将报错。Uncaught TypeError: Reduce of empty array with no initial value
    举个MDN上累加求和的例子:
let sum = [0, 1, 2, 3].reduce(function (accumulator, currentValue) {
  return accumulator + currentValue;
}, 0);
console.log(sum);

find()、findIndex()、indexOf()、includes()、lastIndexOf()

这几个比计较类似,我放在了一起总结。

find()

find() 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined。

  • 该方法不会修改原数组,有返回值,返回值为满足你条件的第一个元素。
  • 只要找到满足了你条件的第一个元素,就直接返回这个值,后面的不会再执行。
let arr = [2, 4, 6, 8, 6];
let newarr = arr.find((value, index, arrSelf) => {
    console.log(value); // 2 4 6
    return value == 6;
})
console.log(newarr); // 6

findIndex()

findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。这个跟上面那个区别就是一个返回值,一个返回索引。

  • 该方法不会修改原数组,有返回值,返回值为满足你条件的第一个元素的索引或-1。
  • 只要找到满足了你条件的第一个元素,就直接返回这个值,后面的不会再执行。
let arr = [2, 4, 6, 8, 6];
let newarr = arr.findIndex((value, index, arrSelf) => {
    console.log(value); // 2 4 6
    return value == 6;
})
console.log(newarr); // 2

includes()

includes() 方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false

  • 该方法不会修改原数组,有返回值,返回值为布尔值。
  • 对象数组不能使用includes方法来检测。
  • 参数有两个:arr.includes(要查找的值 [, 起始索引值]),给起始索引值时,查找过程包含索引值,默认是从头开始查。
let arr = [2, 4, 6, 8,];
let newarr = arr.includes(6, 2);
console.log(newarr);  // true

indexOf()

indexOf()方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。

  • 该方法不会修改原数组,有返回值,返回值为满足你条件的第一个元素的索引或-1。
  • 参数有两个:arr.includes(要查找的值 [, 起始索引值]),给起始索引值时,查找过程包含索引值,默认是从头开始查。
let arr = [2, 4, 6, 8,];
let newarr = arr.indexOf(6, 2);
console.log(newarr); // 2

lastIndexOf()

lastIndexOf() 方法返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1。从数组的后面向前查找,从 fromIndex 处开始。

sort()

sort() 方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的。

  • 该方法不会修改原数组,不会有返回值,直接在原数组上操作。

很多情况我们的数组里面的元素需要排序,并且是数字的情况,如果按照默认的排序法,则排序出来的结果并不是我们想要的,比如以下代码:

const array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1); // [1, 100000, 21, 30, 4]
  • 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;
  • 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这- 一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);
  • 如果 compareFunction(a, b) 大于 0 , a会被排列到 b 之后。

所以我们一般需要给它提供一个回调函数,然后再来排序,比如升序

const array1 = [1, 30, 4, 21, 100000];
array1.sort((a, b) => {
    return a - b;
});
console.log(array1); // [1, 4, 21, 30, 100000]

降序

const array1 = [1, 30, 4, 21, 100000];
array1.sort((a, b) => {
    return b - a;
});
console.log(array1); // [100000, 30, 21, 4, 1]

join()

join() 方法将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串。如果数组只有一个项目,那么将返回该项目而不使用分隔符。

concat()

concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。

splice()

splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组

  • 返回值由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。

slice()

slice() 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变。

push、pop()

这个是操作数组的尾部。

unshift()、shift()

这个是操作数组的头部

  • unshift() 方法将一个或多个元素添加到数组的开头,并返回该数组的新长度(该方法修改原有数组)。
  • shift() 方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。

reverse()

reverse() 方法将数组中元素的位置颠倒,并返回该数组。数组的第一个元素会变成最后一个,数组的最后一个元素变成第一个。该方法会改变原数组。

@cookiepool cookiepool added the JavaScript JS相关的东西 label Nov 22, 2019
@cookiepool cookiepool changed the title [JS]数组API的总结 [JS]常用的数组API总结 Nov 22, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
JavaScript JS相关的东西
Projects
None yet
Development

No branches or pull requests

1 participant