草庐IT

第一百一十四篇: JS数组Array(三)数组常用方法

养肥胖虎 2023-03-28 原文

好家伙,本篇为《JS高级程序设计》第六章“集合引用类型”学习笔记

 

1.数组的复制和填充

批量复制方法 copyWithin(),以及填充数组方法fill()。

这两个方法的函数签名类似,都需要指定既有数组实例上的一个范围,包含开始索引,不包含结束索引。

使用这个方法不会改变数组的大小。

 

1.1.fill()方法

使用fill()方法可以向一个已有的数组中插入全部或部分相同的值

开始索引用于指定开始填充的位置,它是可选的。

如果不提供结束索引,则一直填充到数组末尾。

负值索引从数组末尾开始计算。

const array =[0,0,0,0,0];

//填充5
array.fill(5);
console.log(array);

//从索引为3的数开始填充3
array.fill(3,3);
console.log(array);

//在索引为1到3的数中填充8
array.fill(8,1,3);
console.log(array);

 

 

 

1.2.copyWithin()

copyWithin()会按照指定范围浅复制数组中的部分内容,然后将它们插入到指定索引开始的位置

 

const array =[0,1,0,2,0,3,0,4,0,5];

//复制索引0开始的内容,插入到索引8开始时的位置
array.copyWithin(8);
console.log(array);

//复制索引5开始的内容,插入到索引0开始的位置
array.copyWithin(0,5);
console.log(array);

//复制索引0到索引2的内容,插入到索引6开始的位置
array.copyWithin(6,0,2);
console.log(array);

 

 

 

2.转换方法

前面提到过.所有对象都有toLocaleString()、toString()和valueof()方法。

其中,valueof()返回的还是数组本身。

tostring()返回由数组中每个值的等效字符串拼接而成的一个逗号分隔的三字符串。

let colors = ["red", "blue", "green"];
console.log(colors.toString());
console.log(colors.valueOf());

//使用join()方法可以使用不同的分隔符
console.log(colors.join("||"));

 

 

3.数组常用方法

方法splice()用于创建一个包含原有数组中一个或多个元素的新数组

splice()方法可以接收一个或两个参数:返回元素的开始索引和结束索引。

如果只有一个参数,则splice()会返回该索引到数组末尾的所有元素。

如果有两个参数,则splice()返回从开始索引到结束索引对应的所有元素,其中不包含结束索引对应的元素。

记住,这个操作不影响原始数组。

 

或许最强大的数组方法就属splice()了,使用它的方式可以有很多种。

splice()的主要目的是在数组中间插入元素,但有3种不同的方式使用这个方法。

(确实强大)

(1)  删除。需要给splice()传2个参数:要删除的第一个元素的位置和要删除的元素数量。

可以从数组中删除任意多个元素,比如splice(0,2)会删除前两个元素。

 

(2) 插入。需要给splice()传3个参数:开始位置、0(要删除的元素数量)和要插入的元素,可以在数组中指定的位置插入元素。

第三个参数之后还可以传第四个、第五个参数,乃至任意多个要插入的元素。

比如,splice(2,0,"red","green")会从数组位置2开始插入字符串"red"和"green"。

 

(3) 替换。splice()在删除元素的同时可以在指定位置插入新元素,同样要传入3个参数:开始位置、要删除元素的数量和要插人的任意多个元素。

要插入的元素数量不一定跟删除的元素数量一致。比如,s(2,1,"red","green")会在位置2删除一个元素,然后从该位置开始向数组中插入""和"green"。

splice()方法始终返回这样一个数组,它包含从数组中被删除的元素(如果没有删除元素,则返回空数组)

(一个方法,满足三个愿望)

试一试:

let colors = ["red", "blue", "green"];

colors.splice(0,1);
console.log(colors);

colors.splice(1,0,"black","orange");
console.log(colors);

colors.splice(1,1,"pink");
console.log(colors);

 

 

 

 

4.搜索和"判断"方法

 4.1.搜索方法

ECMAScript提供了3个严格相等的搜索方法:indexof()、lastIndexof()和includes()。

其中,前两个方法在所有版本中都可用,而第三个方法是ECMAScript7新增的。

这些方法都接收两个参数:要查找的元素和一个可选的起始搜索位置

indexof()和includes()方法从数组前头(第一项)开始向后搜索,而lastIndexof()从数组末尾(最后一项)开始向前搜索。
indexof()和 lastIndexof()都返回要查找的元素在数组中的位置,如果没找到则返回-1。

includes()返回布尔值,表示是否至少找到一个与指定元素匹配的项。

 书里面居然没写includes()方法的参数,补充一下:

 

 

 

const array =[1,2,3,4,5,4,3,2,1];

console.log(array.indexOf(1));
console.log(array.lastIndexOf(1));
console.log(array.includes(1));

console.log(array.indexOf(1,5));
console.log(array.lastIndexOf(1,5));
//从索引5开始找"1",找到就返回true
console.log(array.includes(1,5));

 

 

 

4.2.断言函数

ECMAScript 也允许按照定义的断言函数搜索数组,每个索引都会调用这个函数

断言函数的返回值决定了相应索引的元素是否被认为匹配。
断言函数接收3个参数:元素、索引和数组本身。

其中元素是数组中当前搜索的元素,索引是当前元素的索引,而数组就是正在搜索的数组。

断言函数返回真值,表示是否匹配。
find()和findIndex()方法使用了断言函数。

这两个方法都从数组的最小索引开始。

find()返回第一个匹配的元素,findIndex()返回第一个匹配元素的索引。

这两个方法也都接收第二个可选的参数,用于指定断言函数内部this的值。

let people = [{
        name: "panghu",
        age: "80"
    },
    {
        name: "dream",
        age: "50"
    },
    {
        name: "xiaofu",
        age: "30"
    },
];

console.log(people.find((element, index, array) => element.age > 49));

console.log(people.findIndex((element, index, array) => element.age > 49));

 

 

(感觉这个归类进迭代方法也没什么问题)

 

5.迭代方法

ECMAScript为数组定义了5个迭代方法。

每个方法接收两个参数:以每一项为参数运行的函数.个参数:数组元素、元素索引和数组本身。

因具体方法而异,这个函数的执行结果可能会也可能不会影响方法的返回值。

数组的5个迭代方法如下。

 

(1) every():对数组每一项都运行传入的函数,如果对每一项函数都返回true,则这个方法返回true。

(2) some():对数组每一项都运行传入的函数,如果有一项函数返回true,则这个方法返回true。这些方法都不改变调用它们的数组。

(3) map():对数组每一项都运行传入的函数,返回由每次函数调用的结果构成的数组。


(4) filter():对数组每一项都运行传入的函数,函数返回true的项会组成数组之后返回。
(5) forEach():对数组每一项都运行传入的函数,没有返回值。

 

可以说,every(),some(),和map()组成一类,他们像断言函数

filter()和forEach()为一类他们则更像"迭代"操作

重要的例子:

const array = [1, 2, 3, 4, 5, 4, 3, 2, 1];

//every()全部符合要求,才返回true
console.log(array.every((element, index, array) => element > 2));

//some()只要有一个符合要求,就返回true
console.log(array.some((element, index, array) => element > 2));

//map()对所有项调用方法,将每一次调用的结果构成数组返回
console.log(array.map((element, index, array) => element > 2));

//filter()0把符合要求的筛选出来
console.log(array.filter((element, index, array) => element > 2));

//forEach()把符合要求的项进行某些操作
console.log(array.forEach((element, index, array) => element > 2));

 

 

6.归并方法

这个没啥好说的,本质上也是迭代方法的一种,多了几个参数而已

ECMAScript为数组提供了两个归并方法:reduce()和 reduceRight()。

这两个方法都会迭代数组的所有项,并在此基础上构建一个最终返回值。

reduce()方法从数组第一项开始遍历到最后一项。

而 reduceRight()从最后一项开始遍历至第一项。

(一个从左往右,一个从右往左)
这两个方法都接收两个参数:对每一项都会运行的归并函数,以及可选的以之为归并起点的初始值:传给reduce()和reduceRight()的函数接收4个参数:上一个归并值、当前项、当前项的索引和数组本身

这个函数返回的任何值都会作为下一次调用同一个函数的第一个参数。

如果没有给这两个方法传入可选的第二个参数(作为归并起点值),则第一次迭代将从数组的第二项开始,因此传给归并函数的第一个参数是数组的第一项,第二个参数是数组的第二项。
可以使用reduce()函数执行累加数组中所有数值的操作.

 

const array_1 = [9, 90, 900, 9000, 1];

let sum = array_1.reduce((prev, cur, index, array) => 
    prev + cur,
);
console.log(sum);

 

 

 

 

 

That's all

 

有关第一百一十四篇: JS数组Array(三)数组常用方法的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  5. ruby - 在 Ruby 中实现 `call_user_func_array` - 2

    我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)

  6. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  7. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  8. Ruby 方法() 方法 - 2

    我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

  9. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  10. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

随机推荐