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 数组迭代与归并的主要内容,如果未能解决你的问题,请参考以下文章

JS中数组的迭代方法和归并方法

归并排序-迭代法与递归法

JavaScript归并方法reduce()和reduceRight()

javascript实现非递归--归并排序

排序3-选择排序与归并排序(递归实现+非递归实现)

归并排序的JavaScript实现