数组的各种方法

2018-05-18  本文已影响0人  209bd3bc6844

会改变自身的方法

如果指明了`compareFunction`,那么数组会按照调用该函数的返回值进行排序。比较函数`compareFunction`接收两个参数`a`和`b`,`a`和`b`是两个将要被比较的元素:

*   **`compareFunction(a,b)`返回的值小于`0`**:那么`a`就小于`b`,也就是说`a`排在了`b`的前面
*   **`compareFunction(a,b)`返回的值大于`0`**: 那么`a`就大于`b`,也就是说`a`排在了`b`的后面
*   **`compareFunction(a,b)`返回的值等于`0`**:那么`a`就等于`b`,也就是说`a`和`b`的位置保持不变

不仅可以升序降序还可以随机排序

var randomArray = [9,0,23,8,3,5]; 
function randomSort(a, b){ 
  return Math.random() - 0.5; 
} 
console.log(randomArray.sort(randomSort));

数组的sort()

[1, 2, 3, 4, 5].copyWithin(0, 3)
// [4, 5, 3, 4, 5]

上面代码表示将从 3 号位直到数组结束的成员(4 和 5),复制到从 0 号位开始的位置,结果覆盖了原来的 1 和 2。

// 将3号位复制到0号位
[1, 2, 3, 4, 5].copyWithin(0, 3, 4)
// [4, 2, 3, 4, 5]

// -2相当于3号位,-1相当于4号位
[1, 2, 3, 4, 5].copyWithin(0, -2, -1)
// [4, 2, 3, 4, 5]

不会改变自身的方法

var arr = ['abc', 2, {a: 'test'}]
 console.log(arr.toString())        //'abc,2,[object Object]'
          var obj = {a: 'test'}
          var arr = ['a', 'b', {a: 'test'}]
          console.log(arr.indexOf(obj))     //-1  因为是严格相等

          var arr2 = [1, 'b', {a: 'test'}]
          console.log(arr2.indexOf('1'))      //-1

遍历方法

for (let index of ['a', 'b'].keys()) {
  console.log(index);
}
// 0
// 1

for (let elem of ['a', 'b'].values()) {
  console.log(elem);
}
// 'a'
// 'b'

for (let [index, elem] of ['a', 'b'].entries()) {
  console.log(index, elem);
}
// 0 "a"
// 1 "b"

如果不使用for...of循环,可以手动调用遍历器对象的next方法,进行遍历。

let letter = ['a', 'b', 'c'];
let entries = letter.entries();
console.log(entries.next().value); // [0, 'a']
console.log(entries.next().value); // [1, 'b']
console.log(entries.next().value); // [2, 'c']
[1, 5, 10, 15].find(function(value, index, arr) {
  return value > 9;
}) // 10
[1, 5, 10, 15].findIndex(function(value, index, arr) {
  return value > 9;
}) // 2

这两个方法都可以接受第二个参数,用来绑定回调函数的this对象。

function f(v){
  return v > this.age;
}
let person = {name: 'John', age: 20};
[10, 12, 26, 15].find(f, person);    // 26

indexOf方法无法识别数组的NaN成员,但是findIndex方法可以借助Object.is方法做到。

[NaN].indexOf(NaN)
// -1

[NaN].findIndex(y => Object.is(NaN, y))
[0, 1, 2, 3, 4, 5].reduce((p, v, i , a) => {
  return p + v
})
// 数组扁平化
var flattened = [[0, 1], [2, 3], [4, 5]].reduce((a, b) => {
  return a.concat(b)
})
[1, 2, NaN].includes(NaN) // true
[1, 2, 3].includes(3, 3);  // false
[1, 2, 3].includes(3, -1); // true

非数组转换为数组

Array.from方法用于将两类对象转为真正的数组
Array.of方法用于将一组值,转换为数组。

Array.of(3, 11, 8) // [3,11,8]
Array.of(3) // [3]
Array.of(3).length // 1

slice,substring,substr的区别

首先,他们都接收两个参数,slice和substring接收的是起始位置和结束位置(不包括结束位置),而substr接收的则是起始位置和所要返回的字符串长度。直接看下面例子:

var test = 'hello world';

alert(test.slice(4,7));             //o w
alert(test.substring(4,7));         //o w
alert(test.substr(4,7));            //o world

上面的操作都不会改变test字符串,而是返回新值。
substring是以两个参数中较小一个作为起始位置,较大的参数作为结束位置。

接着,当接收的参数是负数时,slice会将它字符串的长度与对应的负数相加,结果作为参数;substr则仅仅是将第一个参数与字符串长度相加后的结果作为第一个参数;substring则干脆将负参数都直接转换为0。
slice,substr和substring的区别
split分割字符串为数组。但是如果分割的参数字符串中没有,返回值还是个数组,只有一个值为字符串本身。

上一篇下一篇

猜你喜欢

热点阅读