美文网首页
进阶篇:ES5数组拓展 (7-3)

进阶篇:ES5数组拓展 (7-3)

作者: 饥人谷1904_陈俊锋 | 来源:发表于2019-05-22 00:07 被阅读0次

饥人谷学习进阶第 7 天

Array.isArray(obj)
Array对象的一个静态函数,用来判断一个对象是不是数组

var a = [ ];
console.log(Array.isArray(a));      // true

.indexOf(element)/.lastIndexOF(element)
这两个方法用于查找数组内指定元素位置,查找到第一个后返回其索引,没有查找到返回-1,indexOf从头至尾搜索,lastIndexOf反向搜索。

var arr = [ 1,2,6,4,3,9,2,4 ]
arr.indexOf(2);      // 1
arr.lastIndexOf(2);      // 6

.forEach(element,index,array)
遍历数组(可改变原数组),参数为一个回调函数,回调函数有三个参数:

  1. 当前元素
  2. 当前元素索引值
  3. 整个数组
var arr = [ 1,2,3,4 ]
arr.forEach(function(v,index,array) {
  array[index] = v*v;
});
console.log(arr);      // [ 1,4,9,16 ]

.every(function(element,index,array))/.some(function(element,index,array))
这两个函数类似于离散数学中的逻辑判定,回调函数返回一个布尔值

  1. every是所有函数的每个回调函数都返回true的时候才会返回true,当遇到false的时候终止执行,返回false
  2. some函数是“存在”有一个回调函数返回true的时候终止执行并返回true,否则返回false
var arr = [ 1,0,2,5,3 ]
arr.every(function(v,index,arr) {
  return v >= 0;
  // (如果替换成) return v > 0;
}) // true (false)

arr.some(function(v,index,arr) {
  return v > 0;
  // (如果替换成) return v < 0;
}) //  true (false)

在空数组上调用every返回true,some返回false。

.map(function(element))
与forEach类似,遍历数组,回调函数返回值组成一个新数组返回,新数组索引结构和原数组一致,原数组不变

var arr = [ 2,3,4,5,6 ]
console.log(arr.map(function(v) {
  return v - 1;
}))  // [ 1,2,3,4,5 ]
console.log(arr);  // [ 2,3,4,5,6 ]

.filter(function(element))
返回数组的一个子集,回调函数用于逻辑判断是否返回,返回true则把当前元素加入返回数组中,false则不加
新数组只包含返回true的值,索引缺失的不包括,原数组保持不变

var arr = [ 2,6,-3,1,8,-1 ]
console.log(arr.filter(function(v) {
  return v < 0;
})) // [ -3,-1 ]
console.log(arr);  // [ 2,6,-3,1,8,-1 ]

.reduce(function(v1, v2), value) / .reduceRight(function(v1, v2), value)
遍历数组,调用回调函数,将数组元素合成一个值,reduce从索引最小值开始,reduceRight反向,方法有两个参数

  1. 回调函数:把两个值合为一个,返回结果
  2. value,一个初始值,可选
var arr = [ 1,2,3,4 ]
var b = arr.reduce(function(v1,v2) {
  return v1 + v2;
}) 
console.log(b); // 10
b = arr.reduceRight(function(v1,v2) {
  return v1 - v2;
},100)
console.log(b);  // 90

深入

实现一个reduce函数,作用和原声的reduce类似

function reduce(arr, fn, initValue) {
  var tmpArr = (initValue === undefined ? [ ] : [initValue]).concat(arr);
  while (tmpArr.length > 1) {
    tmpArr.splice(0, 2, fn (tmpArr[0],tmpArr[1]))
}
  return tmpArr[0];
}
var sum = reduce([1,1,1], function (v1,v2) {
  return v1 + v2;
}, 100)
console.log(sum);      // 103

实现一个flatten函数,将一个嵌套多层的数组array(嵌套可以是任何层数)转换成只有一层的数组,数组中元素仅基本类型的元素或数组,不存在循环引用的情况。

function flatten(arr) {
  return arr.reduce(function(initArr,currentArr) {
  return initArr.concat(Array.isArray(currentArr) ? flatten(currentArr) : currentArr)
}, [ ])
}

function flatten2(arr) {
  var newArr = [ ];
  function _flat(arr) {
    arr.forEach(function(val) {
      if (Array.isArray(val)) {
        _flat(val)
      } else {
      newArr.push(val)
      }
    })
  }
  _flat(arr);
  return newArr;
}

相关文章

  • 进阶篇:ES5数组拓展 (7-3)

    饥人谷学习进阶第 7 天 Array.isArray(obj)Array对象的一个静态函数,用来判断一个对象是不是...

  • ECMAScript 6学习

    数组的拓展 复制数组 es5: map

  • ES5数组拓展

    ES5 数组拓展 ES5为Array对象做了大幅拓展 Array.isArray(obj) 这是Array对象的一...

  • js 取数组中最大值

    es6拓展运算符 es5 apply(与方法1原理相同) for循环 数组sort() 数组reduce

  • ES5数组拓展

    Array.isArray(obj) 这是Array对象的一个静态函数,用来判断一个对象是不是数组 .indexO...

  • ES5数组拓展

    Array.isArray(obj)是不是数组,判断! 这是一个Array对象的一个静态函数,判断一个对象是不是数...

  • ES5 数组拓展

    Array.isArray(obj) 判断一个对象是不是数组 .indexOf(element)/.lastInd...

  • ES5数组方法

    ES5为Array做了大幅拓展 .indexOf / .lastIndexof 该方法用于查找数组内指定元素的位置...

  • ES5 数组拓展&&JSON

    分别举例说明数组方法push、pop、shift、unshift、join、splice、sort、join、re...

  • 数组扩展和数学函数

    ES5 数组拓展 .indexOf(element) 顾名思义,这个方法用于查找数组内指定元素位置,查找到第一个后...

网友评论

      本文标题:进阶篇:ES5数组拓展 (7-3)

      本文链接:https://www.haomeiwen.com/subject/nmsezqtx.html