当前位置:   article > 正文

JavaScript:数组大全_javascript prev

javascript prev

出处:http://www.cnblogs.com/leee/p/5509607.html#pop

栈/队列

  1. 栈:桶。只有一个口(进出)。先进后出,后进先出
  2. 队列:人队。有两个口。先进先出,后进后出

POP 删除最后一项(栈)

删除最后一项,并返回删除元素的值;如果数组为空则返回undefine
  1. var a = [1,2,3,4,5];
  2. a.pop();//a:[1, 2, 3, 4]
  3. a.pop();//a:[1, 2, 3]
  4. a.pop();//a:[1, 2]

shift 删除第一项(队列)

删除原数组第一项,并返回删除元素的值;如果数组为空则返回undefine
  1. var a = [1,2,3,4,5];
  2. a.shift(); //a:[2,3,4,5]
  3. a.shift(); //a:[3, 4, 5]

push 增加到最后(栈)

并返回新数组长度
  1. var a = [1,2,3,4,5];
  2. a.push(6);//[1, 2, 3, 4, 5, 6]
  3. aa.push('xx');//[1, 2, 3, 4, 5, 6, "xx"] 返回长度7
  4. a.push('yy');//[1, 2, 3, 4, 5, 6, "xx", "yy"] 返回长度8

unshift增加到最前(队列)

并返回新数组长度
  1. var a = [1,2,3,4,5];
  2. a.unshift();//[1, 2, 3, 4, 5]
  3. a.unshift("cc");//["cc", 1, 2, 3, 4, 5] 返回长度6
  4. a.unshift("aaa");//["aaa", "cc", 1, 2, 3, 4, 5] 返回长度7

reverse 数组翻转

并返回翻转后的原数组,原数组翻转了
  1. var a = [1,2,3,4,5];
  2. a.reverse()//a:[5, 4, 3, 2, 1] 返回[5, 4, 3, 2, 1]

join数组转成字符串

并返回字符串,原数组木变
  1. var a = [1,2,3,4,5];
  2. var b=a.join('||');//b:"1||2||3||4||5" a:[1,2,3,4,5]

slice截取(切片)数组 返回`截取的数组`,`原数组不变`

返回从原数组中指定开始索引(包含)结束索引(不包含)之间的项组成的新数组,原数组木变 ,索引从0开始
返回“新数组”!!! a不变,好像和值传递 引用传递 有关系
  1. var a = ['a','b','c','d','e'];
  2. a.slice(1,3);//["b", "c"] a:['a','b','c','d','e']
  3. a.slice(0,4);//["a", "b", "c", "d"]
  4. a.slice(3,4);//["d"]
  5. /*参数为1*/
  6. a.slice(2);["c", "d", "e"] //从第三个开始截取(包含),默认截到最后。索引为数组本身长度
  7. a.slice(0);//['a','b','c','d','e'] //新数组和老数组一样 引用不一样 值传递 引用传递 有关系
  8. /*参数为0*/
  9. a.slice();//和a.slice(0)等价 //新数组和老数组一样 引用不一样 值传递 引用传递 有关系
  10. /*如果 slice()方法的参数中有一个负数,则用数组长度加上该数来确定相应的位
  11. 置。例如,在一个包含 5 项的数组上调用 slice(-2,-1)与调用 slice(3,4)得到的
  12. 结果相同。如果结束位置小于起始位置,则返回空数组。*/
  13. a.slice(3,4);//["d"]
  14. a.slice(-2,-1);//["d"] 这种方式:是从右面,最后一个元素开始计算的,右面的第一个为0,越靠左负数依次减一

splice剪接数组 返回`剪接的元素数组` `原数组变化` 可以实现`shift前删除`,`pop后删除`,`unshift前增加`,`同push后增加`一样的效果

返回剪接的元素数组,原数组变化 ,索引从0开始
  1. /*参数为0*/
  2. var a = ['a','b','c','d','e'];
  3. a.splice()//返回[] a:["a", "b", "c", "d", "e"] 截个空数组。 原数组没变。
  4. /*参数为1*/
  5. var a = ['a','b','c','d','e'];
  6. a.splice(0);//['a','b','c','d','e']; a:[]//原数组清空[]。从第一位开始截取,长度默认数组长度。
  7. var a = ['a','b','c','d','e'];
  8. a.splice(2);//返回["c", "d", "e"] 原数组a:["a", "b"]
  9. /*参数是2*/
  10. //第一参数是索引(从0开始),第二是长度
  11. var a = ['a','b','c','d','e'];
  12. a.splice(0,2);//["a", "b"] a:["c", "d", "e"]
  13. a.splice(0,2);//["c", "d"] a:["e"]
  14. var a = ['a','b','c','d','e'];
  15. a.splice(0,1);//["a"] a:["b", "c", "d", "e"] 同shift前删除
  16. var a = ['a','b','c','d','e']
  17. a.splice(a.length-1,1)l//["e"] a:["a", "b", "c", "d"] 同pop前删除
  18. var arr=[1,3,5,777,'e']
  19. arr.splice(2,1) //arr:[1, 3, 777, "e"] 可以删除数组的随便的那个元素!!
  20. /*参数大于2*/
  21. //splice(start,deleteCount,val1,val2,...):从start位置开始删除deleteCount项,并从该位置起插入val1,val2,...
  22. var a = ['a','b','c','d','e'];
  23. a.splice(3,1,10,21,238,99);//["d"] a:["a", "b", "c", 10, 21, 238, 99, "e"]
  24. var a = ['a','b','c','d','e'];
  25. a.splice(a.length,100000000,88)//返回 [] 从最后元素后面的元素,截取长度任意个,肯定是空 a:["a", "b", "c", "d", "e", 88] 同push后增加
  26. var a = ['a','b','c','d','e'];
  27. a.splice(a.length,0,88)//返回 [] 从最后元素后面的元素,截取长度任意个,肯定是空 a:["a", "b", "c", "d", "e", 88] 同push后增加
  28. var a = ['a','b','c','d','e'];
  29. a.splice(0,0,88,99)//返回 [] 从第一个元素,截取长度0个 肯定是空 a:[88, 99, "a", "b", "c", "d", "e"] 同unshift前增加

concat数组合并

返回合并后的新数组,原数组木变
  1. var a = ['a','b','c','d','e'];
  2. a.concat([88,99]);//["a", "b", "c", "d", "e", 88, 99] a:["a", "b", "c", "d", "e"]
  3. var b= [9999,10000]
  4. a.concat(b);// ["a", "b", "c", "d", "e", 9999, 10000] a:["a", "b", "c", "d", "e"]

sort数组排序本质

  1. //坑1:排序后,影响本身(而非生成新数组)
  2. //坑2:默认情况下sort方法是按ascii字母顺序排序的,而非我们认为是按数字大小排序
  3. var arr5=[100,19,52,502];
  4. arr5.sort();
  5. console.log(arr5); //arr5:[100, 19, 502, 52]
  6. //用法3:改变默认比较数字大小来排序 加入function(a,b){return a-b}
  7. //疑问4:a,b 代表.. arguments[0]和arguments[1]//
  8. function compare2Val(a,b){return a-b}
  9. var arr6=[100,19,52,502];
  10. arr6.sort(compare2Val); //调用 不需要传参,
  11. console.log(arr6); //arr6: [19, 52, 100, 502]
  12. //调用 不需要传参的本质
  13. function compare2Argument(){return arguments[0]-arguments[1]}
  14. var arr7=[100,19,52,502];
  15. arr7.sort(compare2Argument); //[19, 52, 100, 502]
  16. console.log(arr7); //arr6: [19, 52, 100, 502]
  17. /*************总比较次数结论**************/
  18. //疑问5 总比较次数:n(n-1)/2 n为数组长度
  19. //答:1:各轮比较次数 的和
  20. //答:2: (数组长度-1+数组长度-2+数组长度-3......+1)
  21. /*
  22. 例数组长度6 比较次数:5+4+3+2+1=15
  23. 例数组长度5 比较次数:4+3+2+1=10
  24. 例数组长度4 比较次数:3+2+1=6
  25. //高中学的1+2+3+.....+n=?
  26. 答案:
  27. 设S=1+2+…+(n-1)+n,
  28. 则S=n+(n-1)+…+2+1
  29. ∴2S=(1+n)+[2+(n-1)]+…+[(n-1)+2]+(n+1)
  30. =n(n+1)
  31. ∴S= n(n+1)/2,
  32. 即1+2+…+(n-1)+n= n(n+1)/2.
  33. */
  34. //比较轮数:数组长度-1 每轮比较产生一个最大值放在数组最右,这个最大值不参与下轮比较
  35. //当前轮比较次数:数组长度-当前轮数
  36. /*************结论**************/
  37. //轮数4()-1 3轮
  38. //第一轮:4-1比较3次 [19,100,52,502]; [19,52,100,502]; [19,52,100,502]; 做3次比较
  39. //第二轮:4-2 比较2次 抛弃502,--->[19,52,100,502]; [19,52,100,502]; 只做19 52 ,52 100的2次比较
  40. //第三轮:4-3 比较1次 抛弃100,502--->[19,52,100,502]; 只做19 52 的1次比较
  41. //5,开发中常用方式
  42. //例:根据人的年龄排序
  43. function person(name,age){
  44. this.Name=name;
  45. this.Age=age
  46. }
  47. var personArray=[];
  48. personArray.push(new person("LiKe",18));
  49. personArray.push(new person("Tom",58));
  50. personArray.push(new person("Lucy",22));
  51. personArray.push(new person("Haimei",16));
  52. function compareAge(a,b){
  53. return a.Age-b.Age;
  54. }
  55. personArray.sort(compareAge);
  56. console.log(personArray);//Haimei LiKe Lucy Tom

ES5

Array.isArray(a)判断a是否为为真正的Array

  1. Array.isArray([]) //true
  2. Array.isArray({}) //false
  3. Array.isArray(11) //false
  4. Array.isArray(null) //false
  5. Array.isArray(undefined) //false

indexOf(element,startIndex)数组第一个元素索引

并返回元素索引,不存在返回-1,开始位置默认从0开始。Array.prototype.indexOf(e,i)``起始位置i为可选
  1. var arr=[1,5,7,'str','str','str',9,10]
  2. arr.indexOf('str')//3
  3. arr.indexOf('str',4)//4
  4. arr.indexOf('f');//-1

lastIndexOf(element,endIndex)数组最后一个元素索引

Array.prototype.lastIndexOf(e,i)``最后位置i为可选,默认arr.length-1
  1. var arr=[1,5,7,'str','str','str',9,10]
  2. arr.lastIndexOf('str')//5
  3. arr.lastIndexOf('str',4)//4 这是重点

以下context,都是灵活设置回调函数的执行上下文

some(fn,context) 数组中是否存在符合~.条件的元素

some(fn(value,index,array){return ..},undefined)``undefined可选,可以为undefined,可以灵活设置回调函数的执行上下文Array.prototype.some(fn,context)
  1. var arr=[1,5,7,'str',[99]]
  2. arr.some(function(value,index,array){return Array.isArray(value)})//true //return“执行”的意思。 Array.isArray(value)“测试函数”的意思。“只要”元素value满足测试(测试返回true),some遍历函数返回true
  3. arr.some(function(value,index,array){return typeof(value)=='string'})//true

every(fn,context) `数组中每个元素是否是符合~.条件`

Array.prototype.every(fn,context)
  1. var aa=[[],[1]];
  2. aa.every(function(currentValue,index,array)){return Array.isArray(currentValue)}//true
  3. var bb=['',[]];
  4. bb.every(function(currentValue,index,array){return Array.isArray(currentValue)},undefined)//false

filter(fn,context) 返回通过测试fn的元素数组

Array.prototype.filter(fn,context)
  1. var arr=[1,5,7,'str','str','str',9,10]
  2. arr.filter(function(value,index,array){return typeof(value)=='number'})//[1, 5, 7, 9, 10]

reduce(fn, initialValue) `从左向右,使用函数r聚集数组的每个元素。可以可选的制定一个初始值v`

Array.prototype.reduce(fn,context)prev, cur, index, array注意函数的参数
一般来讲prev是从数组中第一个元素开始的,cur是第二个元素.但是当你传入初始值(initialValue)后,第一个prev将是initivalValue,cur将是数组中的第一个元素。
  1. //预先知道:15+[6]=156
  2. var values = [1,2,3,4,5,[6]];
  3. var i = 0;
  4. var sum = values.reduce(function (prev, cur, index, array) {
  5. console.log('头值:',prev, '当前值',cur,'比较次数:',++i,'cur的索引:',index);//prev第一次循环,为第一个值。以后的循环的值,是逻辑出来算的
  6. return prev + cur;//得到的头值,参与下次循环,赋值给prev。当然下次循环 头值也会和下次的当前值进行此种逻辑(这里是加)
  7. });
  8. console.log(sum);
  9. /* 结果
  10. 头值: 1 当前值 2 比较次数: 1 cur的索引: 1
  11. 头值: 3 当前值 3 比较次数: 2 cur的索引: 2
  12. 头值: 6 当前值 4 比较次数: 3 cur的索引: 3
  13. 头值: 10 当前值 5 比较次数: 4 cur的索引: 4
  14. 头值: 15 当前值 [6] 比较次数: 5 cur的索引: 5
  15. 156
  16. */
  17. /*第二个例子,参考张鑫旭的例子*/
  18. var matrix = [
  19. [1, 2],
  20. [3, 4],
  21. [5, 6]
  22. ];
  23. // 二维数组扁平化
  24. var flatten = matrix.reduce(function (previous, current) {
  25. console.log(previous);//2次循环 length-1
  26. return previous.concat(current);
  27. });
  28. console.log(flatten);//[1, 2, 3, 4, 5, 6]
  29. /*
  30. [1, 2]
  31. [1, 2, 3, 4]
  32. */
  33. /*第三个例子,里面用到了es6的of方法,将类数组,类数组变量转变成数组。类似new Array*/
  34. var matrix = [
  35. 999,
  36. [3, 4],
  37. [5, 6]
  38. ];
  39. // 二维数组扁平化
  40. var flatten = matrix.reduce(function (previous, current) {
  41. if (!Array.isArray(previous)) {
  42. previous = Array.of(previous);
  43. }
  44. return previous.concat(current);
  45. });
  46. console.log(flatten);//[999, 3, 4, 5, 6]
  47. /*第四个例子,2个参数 参考:http://www.jb51.net/article/60502.htm*/
  48. var arr = ["apple","orange"];
  49. function noPassValue(){
  50. return arr.reduce(function(prev,next){
  51. console.log("prev:",prev);
  52. console.log("next:",next);
  53. return prev + " " +next;
  54. });
  55. }
  56. function passValue(){
  57. return arr.reduce(function(prev,next){
  58. console.log("prev:",prev);
  59. console.log("next:",next);
  60. prev[next] = 1;
  61. return prev;
  62. },{});
  63. }
  64. console.log("No Additional parameter:",noPassValue());
  65. console.log("----------------");
  66. console.log("With {} as an additional parameter:",passValue());
  67. /*
  68. prev: apple
  69. next: orange
  70. No Additional parameter: apple orange
  71. ----------------
  72. prev: Object {}
  73. next: apple
  74. prev: Object {apple: 1}
  75. next: orange
  76. With {} as an additional parameter: Object {apple: 1, orange: 1}
  77. */
  78. //第5个例子:统计一个数组中有多少个不重复的单词
  79. var arr = ["apple", "orange", "apple", "orange", "pear", "orange"];
  80. function getWordCnt() {
  81. return arr.reduce(function (prev, next) {
  82. console.log(prev, next);
  83. prev[next] = (prev[next] + 1) || 1; //修改本次prev
  84. return prev;//返回的这个值,作为下次循环的prev的值 ,在前面外面可以将本次的prev变成任何类型 本质延伸到了initialValue设置的类型
  85. }, {});
  86. }
  87. console.log(getWordCnt());
  88. Object {} "apple"
  89. Object {apple: 1} "orange"
  90. Object {apple: 1, orange: 1} "apple"
  91. Object {apple: 2, orange: 1} "orange"
  92. Object {apple: 2, orange: 2} "pear"
  93. Object {apple: 2, orange: 2, pear: 1} "orange"
  94. Object {apple: 2, orange: 3, pear: 1}

reduceRight

Array.prototype.reduceRight(r,v)是Array.prototype.reduce的从右向左的版本。
  1. var matrix = [
  2. 999,
  3. [3, 4],
  4. [5, 6]
  5. ];
  6. var flatten = matrix.reduceRight(function (previous, current) {
  7. console.log(previous, current);
  8. if (!Array.isArray(previous)) {
  9. previous = Array.of(previous);
  10. }
  11. return previous.concat(current);
  12. });
  13. /*
  14. [5, 6] [3, 4]
  15. [5, 6, 3, 4] 999
  16. */

forEach

Array.prototype.forEach(fn,context),val, index, arr
  1. [1, 2, 'str', ['a'], true].forEach(function (val, index, arr) {
  2. if (val) {
  3. console.log(val, index)
  4. }
  5. })
  6. /*
  7. 1 0
  8. 2 1
  9. str 2
  10. ["a"] 3
  11. true 4
  12. */
  13. {a:1,b:2}.forEach(function(val,index,obj){if(val){console.log(val)}})//object 报错

map

Array.prototype.map(fn,context),

所以在fn中一定有return,参数必须是val,index,array。这个fn可以是自定义,也可以是js内置的方法比如Math.sqaure使用函数fn修改每个元素,按顺序收集f的每个返回值返回这个新组成的数组

  1. //参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map
  2. 第一:每项单词转换成对应的复数形式.
  3. function fuzzyPlural(single) {
  4. var result = single.replace(/o/g, 'e');
  5. if( single === 'kangaroo'){
  6. result += 'se';
  7. }
  8. return result;
  9. }
  10. var words = ["foot", "goose", "moose", "kangaroo"];
  11. console.log(words.map(fuzzyPlural));
  12. // ["feet", "geese", "meese", "kangareese"]
  13. 第二:求数组中每个元素的平方根
  14. var numbers = [1, 4, 9];
  15. var roots = numbers.map(Math.sqrt);
  16. /* roots的值为[1, 2, 3], numbers的值仍为[1, 4, 9] */
  17. 第三:String 上使用 map 方法获取字符串中每个字符所对应的 ASCII 码组成的数组:
  18. var map = Array.prototype.map
  19. var a = map.call("Hello World", function(x) { return x.charCodeAt(0); })
  20. // a的值为[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
  21. 第四:通常情况下,map 方法中的fn函数只需要接受一个参数,就是正在被遍历的数组元素本身。但这并不意味着 map 只给fn传了一个参数。这个思维惯性可能会让我们犯一个很容易犯的错误。
  22. // 下面的语句返回什么呢:
  23. ["1", "2", "3"].map(parseInt);
  24. // 你可能觉的会是[1, 2, 3]
  25. // 但实际的结果是 [1, NaN, NaN]
  26. // 通常使用parseInt时,只需要传递一个参数.但实际上,parseInt可以有两个参数.第二个参数是进制数.可以通过语句"alert(parseInt.length)===2"来验证.
  27. // map方法在调用callback函数时,会给它传递三个参数:当前正在遍历的元素, 元素索引, 原数组本身.
  28. // 第三个参数parseInt会忽视, 但第二个参数不会,也就是说,parseInt把传过来的索引值当成进制数来使用.从而返回了NaN.
  29. /*
  30. //应该使用如下的用户函数returnInt
  31. function returnInt(element){
  32. return parseInt(element,10);
  33. }
  34. ["1", "2", "3"].map(returnInt);
  35. // 返回[1,2,3]
  36. *

类数组

权威指南定义

  1. // Determine if o is an array-like object.判定o是否是一个类数组对象
  2. // Strings and functions have numeric length properties, but are 字符串和函数有length属性,但是它们
  3. // excluded by the typeof test. In client-side JavaScript, DOM text可以用typeof检测将其排除,在客户端js中,DOM文本节点
  4. // nodes have a numeric length property, and may need to be excluded 也有length属性,需要额外判断o.nodeType!=3将其排除
  5. // with an additional o.nodeType != 3 test.
  6. function isArrayLike(o) {
  7. if (o && // o is not null, undefined, etc. o非null undefined等
  8. typeof o === 'object' && // o is an object o是对象
  9. isFinite(o.length) && // o.length is a finite number o.length是个有限数值
  10. o.length >= 0 && // o.length is non-negative o.length是非负值
  11. o.length===Math.floor(o.length) && // o.length is an integer o.length是整数
  12. o.length < 4294967296) // o.length < 2^32 o.length小于2^32
  13. return true; // Then o is array-like
  14. else
  15. return false; // Otherwise it is not //否则它不是类数组
  16. }

通用类数组的使用

1:是{ 含有length键值对}2:[]都是类数组

  1. //1:{ 含有length属性的键值对}
  2. isArrayLike({qq:"aa",ww:"bbb",ss:"ccc",length:3})//true
  3. isArrayLike({"0":"aa",1:"bbb",2:"ccc",length:3})//true 特殊的类数组
  4. //2:[]普通数组
  5. isArrayLike([])//true

特殊的类数组

像数组一样使用类数组(对象的属性是“数值”字符串,'0' '1' '2' '3'....)

  1. /*
  2. 因为这些"{ 含有length属性的键值对}"类数组对象,不是通过new Array()构造函数构造出来的,所以这些不具备Array的原型方法。
  3. 但是我们可以使用改变作用域的方式来使用,[].map.call({},fn),[].slice.call({},..)等数组方法
  4. 如果想想数组一样使用它们,除了加上length属性,需要这样做:
  5. 需要保证这个对象的属性必须是“数值”字符串,'0' '1' '2' '3'....
  6. */
  7. [].map.call({0:"aa",1:"bbb",2:"ccc",length:3},function(val){return val+"ooooooo"})//["aaooooooo", "bbbooooooo", "cccooooooo"]
  8. //常使用的功能:类数组对象转化为数组
  9. [].slice.call({0:"aa",1:"bbb",2:"ccc",length:3},0)//["aa", "bbb", "ccc"]

在平常的开发中的类数组 arguments Nodelist

  1. /*
  2. 注意:
  3. 函数的内置对象arguments本身就是类数组,本身不能使用Array的原型实例方法,但可以通过call等改变作用域的方式来使用;
  4. */
  5. //arguments
  6. a(1,"2")
  7. function a(){
  8. console.log(arguments);//[1, "2"],这里打印出的虽然是[],看上去是数组,但是展开的如下图,和普通数组不一样。
  9. //console.log(arguments.slice())//这样会报错: Uncaught TypeError: arguments.slice is not a function
  10. console.log([].slice.call(arguments));//[1, "2"]
  11. }
  12. console.log([].slice.call({0:"a",1:"bbb",2:"ccc",str:"str",str2:"str2",length:5}))//slice会把属性不为数字的类数组去掉
  13. //NodeList
  14. var falseArr=document.getElementsByTagName('div');
  15. for(item in falseArr)console.log(item)//可以看到,item是 0 1 2 3...还有一些 id class等,证明NodeList是类数组
  16. //falseArr.slice()//报错
  17. console.log([].slice.call(falseArr))

截图

作为数组的字符串

  1. var str="asfwefwgw";
  2. for(i=0; i<str.length;i++){console.log(i)}
  3. for(i=0; i<str.length;i++){console.log(str[i])}

Array.from(arrayLike,[fn])

从类数组,set、Map(可遍历)转变成数组
  1. //特殊类数组(键是数字)
  2. var o={"0":"aa",1:"bbb",2:"ccc",length:3};Array.from(o);//["aa", "bbb", "ccc"]
  3. //一般类数组
  4. var o={qq:"aa",ww:"bbb",ss:"ccc",length:3};Array.from(o);//[undefined, undefined, undefined]
  1. //类数组nodeList不能直接使用数组实例方法,要call apply改变作用域才可以
  2. var nodes=document.getElementsByTagName('a');
  3. // nodes.forEach(function(val,key){console.log(key);})//nodes.forEach is not a function
  4. //es5
  5. //Array.prototype.forEach.call ,[].forEach.call
  6. [].forEach.call(nodes,function(val,key){console.log(key);})
  7. //es6
  8. var nodesArray=Array.from(nodes);
  9. nodesArray.forEach(function(val,key){console.log(key);})
  1. //类数组arguments不能直接使用数组实例方法,要call apply改变作用域才可以
  2. function foo(){
  3. //arguments.forEach(function(val,index){console.log(index)})//arguments.forEach is not a function
  4. Array.prototype.forEach.call(arguments,function(val,index){console.log(index)})//1,2,3
  5. Array.from(arguments).forEach(function(val,index){console.log(index)})//1,2,3
  6. }
  7. foo(1,2,3)
//字符串
//Set
//Map

兼容低版本IE扩展的Array

  1. if (typeof Array.prototype.forEach != "function") {
  2. Array.prototype.forEach = function (fn, context) {
  3. for (var k = 0, length = this.length; k < length; k++) {
  4. if (typeof fn === "function" && Object.prototype.hasOwnProperty.call(this, k)) fn.call(context, this[k], k, this);
  5. }
  6. };
  7. }
  8. if (typeof Array.prototype.map != "function") {
  9. Array.prototype.map = function (fn, context) {
  10. var arr = [];
  11. if (typeof fn === "function") {
  12. for (var k = 0, length = this.length; k < length; k++) {
  13. arr.push(fn.call(context, this[k], k, this));
  14. }
  15. }
  16. return arr;
  17. };
  18. }
  19. if (typeof Array.prototype.filter != "function") {
  20. Array.prototype.filter = function (fn, context) {
  21. var arr = [];
  22. if (typeof fn === "function") {
  23. for (var k = 0, length = this.length; k < length; k++) {
  24. fn.call(context, this[k], k, this) && arr.push(this[k]);
  25. }
  26. }
  27. return arr;
  28. };
  29. }
  30. if (typeof Array.prototype.some != "function") {
  31. Array.prototype.some = function (fn, context) {
  32. var passed = false;
  33. if (typeof fn === "function") {
  34. for (var k = 0, length = this.length; k < length; k++) {
  35. if (passed === true) break;
  36. passed = !!fn.call(context, this[k], k, this);
  37. }
  38. }
  39. return passed;
  40. };
  41. }
  42. if (typeof Array.prototype.every != "function") {
  43. Array.prototype.every = function (fn, context) {
  44. var passed = true;
  45. if (typeof fn === "function") {
  46. for (var k = 0, length = this.length; k < length; k++) {
  47. if (passed === false) break;
  48. passed = !!fn.call(context, this[k], k, this);
  49. }
  50. }
  51. return passed;
  52. };
  53. }
  54. if (typeof Array.prototype.indexOf != "function") {
  55. Array.prototype.indexOf = function (searchElement, fromIndex) {
  56. var index = -1;
  57. fromIndex = fromIndex * 1 || 0;
  58. for (var k = 0, length = this.length; k < length; k++) {
  59. if (k >= fromIndex && this[k] === searchElement) {
  60. index = k;
  61. break;
  62. }
  63. }
  64. return index;
  65. };
  66. }
  67. if (typeof Array.prototype.lastIndexOf != "function") {
  68. Array.prototype.lastIndexOf = function (searchElement, fromIndex) {
  69. var index = -1, length = this.length;
  70. fromIndex = fromIndex * 1 || length - 1;
  71. for (var k = length - 1; k > -1; k-=1) {
  72. if (k <= fromIndex && this[k] === searchElement) {
  73. index = k;
  74. break;
  75. }
  76. }
  77. return index;
  78. };
  79. }
  80. if (typeof Array.prototype.reduce != "function") {
  81. Array.prototype.reduce = function (callback, initialValue ) {
  82. var previous = initialValue, k = 0, length = this.length;
  83. if (typeof initialValue === "undefined") {
  84. previous = this[0];
  85. k = 1;
  86. }
  87. if (typeof callback === "function") {
  88. for (k; k < length; k++) {
  89. this.hasOwnProperty(k) && (previous = callback(previous, this[k], k, this));
  90. }
  91. }
  92. return previous;
  93. };
  94. }
  95. if (typeof Array.prototype.reduceRight != "function") {
  96. Array.prototype.reduceRight = function (callback, initialValue ) {
  97. var length = this.length, k = length - 1, previous = initialValue;
  98. if (typeof initialValue === "undefined") {
  99. previous = this[length - 1];
  100. k--;
  101. }
  102. if (typeof callback === "function") {
  103. for (k; k > -1; k-=1) {
  104. this.hasOwnProperty(k) && (previous = callback(previous, this[k], k, this));
  105. }
  106. }
  107. return previous;
  108. };
  109. }

参考:
MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
http://www.zhangxinxu.com/wordpress/2013/04/es5%E6%96%B0%E5%A2%9E%E6%95%B0%E7%BB%84%E6%96%B9%E6%B3%95/


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/901704
推荐阅读
相关标签
  

闽ICP备14008679号