javascript 数组迭代与归并
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript 数组迭代与归并相关的知识,希望对你有一定的参考价值。
数组的5个迭代方法:
every(); //对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true; filter(); //对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组; forEach(); //对数组中的每一项运行给定函数,这个方法没有返回值; map(); //对数组中的每一项运行给定函数,返回函数每次调用的结果组成的数组; some(); //对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true。
*:以上方法都不会修改数组中包含的值!
每个方法都接受两个参数,要在每一项上运行的函数和运行该函数的作用域对象(可选、影响this的值)
传入的函数会接受三个参数:数组项的值、该项在数组中的位置以及数组对象本身。
以map()为例:array1.map(callback[,thisArg])
array1:必需,一个数组对象
callbackfn:必需,一个接受最多三个参数的函数,对于数组中的每个元素,,map都会调用callbackfn一次
thisArg:可选,可在callbackfn中为其引用this关键字的对象,如果省略,则undefined将用作this的值。
[“1”,“2”,“3”].map(parseInt)的运行结果是------------[1,NaN,NaN]
parseInt 需要两个参数(val,radix),而map()传递了三个参数:(element,index,array)在这里map函数将数组的索引传递给了第二个参数。
荔枝:写一个函数,要求传入一个字符串,统计其中a-z的字母(大小写均算),若字符串中存在这个英文字母,则在函数返回的长为26的字符串中的相应位置输出1(按a-z的顺序)比如说输入‘a **& bZ‘,输出‘11000000000000000000000001‘【例子都是codewars上的- -解释能力不行说不太明白】
function change(string) { string = string.toLowerCase() return ‘abcdefghijklmnopqrstuvwxyz‘.split(‘‘).map(function (c) { return string.indexOf(c) !== -1 ? 1 : 0; }).join(‘‘); }
荔枝2: 返回数组中某一项的数量
//比如说
var arr = [0,1,2,2,3]; arr.numberOfOccurrences(0) === 1; arr.numberOfOccurrences(4) === 0; arr.numberOfOccurrences(2) === 2; arr.numberOfOccurrences("a") === 0;
//使用filter()解决: Array.prototype.numberOfOccurrences = function(search) { return this.filter( function(num){ return search === num } ).length; }
荔枝3:toWeirdCase()函数,接受一个字符串参数(英文字符,如“Weird string case”,“String”,若有多个单词则中间用一个空格隔开),这个函数要求输出一个字符串:其中的每个单词中位数为奇数的为大写,其余小写。
//#1 function toWeirdCase(string) { function singleWeird(e) { var word = e.split(‘‘); for (var i = 0; i < word.length; i += 2) { word[i] = word[i].toUpperCase(); } return word.join(‘‘); } return string.split(‘ ‘).map(function (e) { return singleWeird(e); }).join(‘ ‘); } //#2 function toWeirdCase(string){ return string.split(‘ ‘).map(function(word){ return word.split(‘‘).map(function(letter, index){ return index % 2 == 0 ? letter.toUpperCase() : letter.toLowerCase() }).join(‘‘); }).join(‘ ‘); } //#3: function toWeirdCaseCharacter(chr, index) { return index % 2 ? chr.toLowerCase() : chr.toUpperCase(); } function toWeirdCaseWord(word){ return word.split("").map(toWeirdCaseCharacter).join(""); } function toWeirdCase(string){ return string.split(" ").map(toWeirdCaseWord).join(" "); } //正则: function toWeirdCase(string){ return string.replace(/(\b(\S)*\b)/g, function(v,i){ return v.split("").map(function(v, i) { return (i%2 == 0) ? v.toUpperCase(): v}).join("") }) }
ECMAScript5新增了两个归并数组的方法:reduce()和reduceRight()。这两个方法都会迭代数组的所有项,然后构建一个最终返回的值(对数组中的所有元素调用指定的回调函数。 该回调函数的返回值为累积结果,并且此返回值在下一次调用该回调函数时作为参数提供。)。
其中reduce()从数组的第一项开始而reduceRight()则从最后一项开始往前遍历。
以reduce();为例:
array1.reduce(callbackfn[, initialValue]) //array1:【必需】 一个数组对象 //callbackfn:【必需】 一个接受最多四个参数的函数。 对于数组中的每个元素,reduce 方法都会调用 callbackfn 函数一次。 //initialValue:【可选】 如果指定 initialValue,则它将用作初始值来启动累积。 第一次调用 callbackfn 函数会将此值作为参数而非数组值提供
//返回值:通过最后一次调用回调函数获得的累积结果。
//如果提供了 initialValue,则 reduce 方法会对数组中的每个元素调用一次 callbackfn 函数(按升序索引顺序)。 如果未提供 initialValue,则 reduce 方法会对从第二个元素//开始的每个元素调用 callbackfn 函数。(reduceRight()的处理顺序相反)
//回调函数的返回值在下一次调用回调函数时作为 previousValue 参数提供。 最后一次调用回调函数获得的返回值为 reduce 方法的返回值。
回调函数: function callbackfn(previousValue, currentValue, currentIndex, array1) //可使用最多四个参数来声明回调函数。
//【previousValue】:通过上一次调用回调函数获得的值。 如果向 reduce 方法提供initialValue,则在首次调用函数时,previousValue 为 initialValue。
//【currentValue】:当前数组元素的值。
//【currentIndex】:当前数组元素的数字索引。
//【array1】:包含该元素的数组对象。
在第一次调用回调函数时,作为参数提供的值取决于 reduce 方法是否具有 initialValue 参数。
如果向 reduce 方法提供 initialValue:
-
-
previousValue 参数为 initialValue。
-
currentValue 参数是数组中的第一个元素的值。
-
如果未提供 initialValue:
-
-
previousValue 参数是数组中的第一个元素的值。
-
currentValue 参数是数组中的第二个元素的值。
-
荔枝:向一个函数传入一个String,函数返回包含字符串中大写字母所在位置的数组:
var capitals = function (word) { return word.split(‘‘).reduce(function(memo, v, i) { return v === v.toUpperCase() ? memo.concat(i) : memo; }, []); };
以上是关于javascript 数组迭代与归并的主要内容,如果未能解决你的问题,请参考以下文章