草庐IT

javaScript 常用数组方法汇总

暴躁程序员 2023-09-15 原文

0. 数组判断

const arr= [1,2,3,4,5]
Array.isArray(arr) // 结果:true

1. 常见的数组方法

1. array.push(),向数组的末尾添加一个或多个元素,并返回新的数组长度。原数组改变。
2. array.pop(),删除并返回数组的最后一个元素,若该数组为空,则返回undefined。原数组改变。
3. array.unshift(),向数组的开头添加一个或多个元素,并返回新的数组长度。原数组改变。
4. array.shift(),删除数组的第一项,并返回第一个元素的值。若该数组为空,则返回undefined。原数组改变。
5. array.concat(arr1,arr2...),合并两个或多个数组,生成一个新的数组。原数组不变。
6. array.join(),将数组的每一项用指定字符连接形成一个字符串。默认连接字符为 “,” 逗号(数组转字符串)。
7. array.reverse(),将数组倒序。原数组改变。
8. array.sort(),对数组元素进行排序。按照字符串UniCode码排序,原数组改变。(特殊写法)。
9.  array.map(function),原数组的每一项执行函数后,返回一个新的数组。原数组不变。(注意该方法和forEach的区别)。
10. array.splice(删除位置,删除个数,添加内容) ,删除元素并添加元素,从index位置开始删除howmany个元素,
11. array.slice(startIndex, endIndex),截取指定位置的数组,并且返回截取的数组,不会改变原数组
12. array.forEach(function),用于调用数组的每个元素,并将元素传递给回调函数。原数组不变。
13. array.filter(function),过滤数组中,符合条件的元素并返回一个新的数组。
14. array.every(function),对数组中的每一项进行判断,必须全符合返回true,相等于 并
15. array.some(function),对数组中的每一项进行判断,有一个符合的返回true。相当于 或
16. array.reduce(function),reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
17. Array.isArray(array) 判断一个对象是不是数组,返回的是布尔值
18. array.toString() 此方法将数组转化为字符串:
19. array.valueOf() ,返回数组的原始值(一般情况下其实就是数组自身),一般由js在后台调用
20. array.indexOf(value, start-此参数:开始查询的位置) ,如果不存在指定的数据,返回-1,找到了指定的数据返回该数据的索引
21. array.lastIndexOf(),返回一个指定的字符串值最后出现的位置 
22. array.reduceRight(),数组的最后一项开始,向前逐个遍历到第一位
23. array.find(function),返回数组中满足条件的第一项
24. array.includes(值, 起始位置), 数组中是否包含此值,包含则返回 true

2. 常见的改变原数组的方法

array.push()
array.unshift()
array.pop()
array.shift()
array.splice()
array.reverse()
array.sort()
array.fill()

3. 数组元素的增、删、改

  1. 增加
array.push(...数组),如果将一个数组里的值push到原数组,需要在数组前加上 ... 拓展符
array.unshift(...数组),如果将一个数组里的值unshift到原数组,需要在数组前加上 ... 拓展符
array.splice(index,0,...arr),三个参数:删除的位置,删除0个,替换的值(数组用拓展符 ...)
  1. 删除
array.pop() 移除最后一个元素, 并返回该元素值
array.shift() 移除最前一个元素, 并返回该元素值,数组中元素自动前移
array.splice(index,num),两个参数:删除的位置,删除的个数(返回删除的值)
  1. 修改
array.splice(index,num,...arr),三个参数:删除的位置,删除num个,替换的值(数组用拓展符 ...)
  • array.splice(删除位置,删除个数,替换的值) 方法可以通过控制参数的变化来完成数组任意位置的增、删、改
  • 增:第二个参数,删除的个数为 0
  • 删:第三个参数,替换的元素去掉
  • 改:三个参数全生效(以数组的方式返回删除的元素)

4. 数组合并

array.concat(第二数组,第三数组),返回合并后的新数组,不改变原数组
[ ].push/unshift(...arr1,...arr2),创建空数组,巧妙利用 push/unshift 方法

5. 数组深拷贝(不是改变指向,而是新数组)

array.slice(0), 返回截取的新数组,为0,就是从第一位开始到最后一位
array.map() 写法一:array.map(function(currentValue,index,arr){ return currentValue}),
array.map() 写法二:array.map(item => item),原理就是:映射返回本身新数组
array.filter() 写法一:array.filter(function(currentValue,index,arr){ return currentValue}),
array.filter() 写法二:array.filter(item => item),原理就是:过滤不设置条件返回本身新数组

6.数组元素的过滤

  1. array.filter() 过滤,返回满足条件的数组元素(返回新数组)
array.filter((currentValue,index,arr) => { return currentValue < 100})
  1. array.find() 过滤,返回满足条件的数组元素的第一项
array.find((currentValue,index,arr) => { return currentValue < 100})
  1. array.map()映射,重组,返回数组元素按条件改变后的映射(返回新数组)(数组的重塑)
array.map((currentValue,index,arr) => { return currentValue + 100})
  1. array.every() 过滤判断,返回布尔值,全部满足返回true,否则false,相当于 &&
array.every((currentValue,index,arr) => { return currentValue < 100})
  1. array.some() 过滤判断,返回布尔值,有一个满足返回true,否则false,相当于 ||
array.some((currentValue,index,arr) => { return currentValue < 100})

7. 数组元素的遍历

  1. for循环遍历数组
const array = [1, 2, 3, 4, 5]
  for (let i = 0; i < array.length; i++) {
    console.log(array[i]);
  }
  1. array.forEach()方法遍历数组(return无返回值)
const array = [1, 2, 3, 4, 5]
  array.forEach((item, index, arr) => {
    console.log(item,index,arr);
  })
  1. Array.map()方法遍历数组,另外可获得映射后的新数组
const array = [1, 2, 3, 4, 5]
  const result = array.map((item, index, arr) => {
    console.log(item, index, arr);
    if(item > 3) {
      return item + '元'
    }else{
      return item + '个'
    }
  })
  console.log(result);
  1. array.filter()方法遍历数组,另外可返回满足条件的元素组成的新数组
const array = [1, 2, 3, 4, 5]
  const result = array.filter((item, index, arr) => {
    console.log(item, index, arr);
    return item
   })
  console.log(result);
  1. for in方法,此方法遍历数组效率低,主要是用来循环遍历对象的属性
  • 遍历数组

注意: key 是字符串不是数字,因为key是对象的属性名称

const object = [1, 2, 3, 4, 5]
  for (const key in object) {
    if (Object.hasOwnProperty.call(object, key)) {
      console.log(object,key,object[key]);
    }
  }
  • 遍历对象
const object = {
    username: 'admin',
    password: '2021/11/12'
  }
  for (const key in object) {
    if (Object.hasOwnProperty.call(object, key)) {
      console.log(object,key,object[key]);
    }
  }
  1. for of方法,此方法遍历数组,无法获取索引,但它可以遍历很多东西(es6)
const array = [1,2,3,4,5];
  for (var item of array) {
    console.log(item);
  }
特:中断循环体(break、continue)
  • break中断整个循环,continue 只跳过不遍历当前元素
  • return 中断是放在函数体中使用并返回值,放在循环体中报错
  • 只有 array.forEach() 、array.map() 循环体不能被中断,如果使用会报错且阻断程序
const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
  for (let i = 0; i < array.length; i++) {
    if (array[i] === 2 || array[i] === 4) {
      continue
    }
    if (array[i] === 7) {
      break
    }
    console.log(array[i]); // 结果: 1  3  5  6
  }

8. 数组元素去重

  • 基础类型去重

1. from set 去重 (推荐)(es6)

思想:new Set(array) 将数组里面的元素去重但是会转化成set结构数
Array.from(new Set(array)) 将set结构的数组转化成真正的数组

注意:非数组类型传入会报错,前需要加上类型判断拦截,不改变原数组

function fromSet(array) {
    if (Array.isArray(array) === false) {
      console.log('数据类型不是数组');
      return;
    }
    return Array.from(new Set(array));
  }
2. indexOf 去重

思想:通过数组的indexOf()方法,判断新数组无原数组的值则push,否则继续遍历

function indexOf(array) {
    const newArray = []
    for (let i = 0; i < array.length; i++) {
      if (newArray.indexOf(array[i]) === -1) {
        newArray.push(array[i])
      }
    }
    return newArray
  }
3. 双层for循环去重

思想:此方法就是在原数组的基础上删除重复的元素,将原数组的第i项和原数组的第i项之后的元素做对比,有相同的就删掉,没有就遍历下一个(每遍历删除一次相同的元素,用来遍历的原数组就少一项相同的)

注意:会改变原数组

function twoFor(array) {
    for (var i = 0; i < array.length; i++) {
      for (var j = i + 1; j < array.length; j++) {
        if (array[i] === array[j]) {
          array.splice(j, 1);
          j--;
        }
      }
    }
    return array;
  }

9. 数组的排序

  1. 数组元素反转
array.reverse(),返回反转后的新数组,同时也改变原数组
  1. 数字数组排序
const arr = [99,2,3,4,33,3,5,1000,555]
arr.sort((a,b) => {
    return a-b     // 从小到大
    // return b-a  // 从大到小
})
console.log(arr);
  1. 对象数字数组排序
const arr = [{
    name: '张三',
    age: 22
},{
    name: '李四',
    age: 8
}]
arr.sort((a,b) => {
    return a.age-b.age     // 从小到大
    // return b.age-a.age  // 从大到小
})
console.log(arr);
  1. 对象字符串数组排序,字母和汉字粗略排序
    const arr1 = [{ label: 'c' }, { label: 'a' }, { label: 'b' }, { label: '从' }, { label: '啊' }, { label: '吧' }]
    const arr2 = [{ name: 'z' }, { name: 'x' }, { name: 'y' }, { name: '从' }, { name: '啊' }, { name: '吧' }]

    sortArr(arr1,'label')
    sortArr(arr2,'name')

    function sortArr(arr, label) {
        var re = new RegExp('^[\u4e00-\u9fa5]') // 是否以汉字开头
        const arrA = arr.filter(item => {  // 汉字开头
            if (re.test(item[label])) {
                return item
            }
        })
        const arrB = arr.filter(item => {  // 字母开头
            if (!re.test(item[label])) {
                return item
            }
        })
        if (arrA.length > 0) {
            arrA.sort((a, b) => {
                return a[label].localeCompare(b[label], 'zh-CN');
            })
        }
        if (arrB.length > 0) {
            arrB.sort((s, t) => {
                const a = s[label].toLowerCase()
                const b = t[label].toLowerCase()
                if (a < b) return -1
                if (a > b) return 1
                return 0
            })
        }
        console.log(arrA.concat(arrB));
    }
  1. 冒泡排序

for循环嵌套的方式,将当前项和后一项做比较,大于则交换位置

const arr = [77, 35, 1, 10000, 454, 78, 0, -1]
    let temp;
    for (let i = 0; i < arr.length; i++) {
        for (let j = 0; j < arr.length; j++) {
            if (arr[j] > arr[j + 1]) {
                temp = arr[j]
                arr[j] = arr[j + 1]; // 后一项等于当前项
                arr[j + 1] = temp; // 当前项等于后一项
            }
        }
    }
    console.log(arr)

10. 数组累加、求最值

  1. 累加
    arr.reduce() 方法实现
const arr = [100, 200, 300, 400, 500]
const mul = arr.reduce((total, currentValue, index, arr) => {
    console.log(total); // 必传,不断累加的总数。
    console.log(currentValue); // 必传,遍历时的当前值
    console.log(index); // 可不传,遍历时的当前索引
    console.log(arr); // 可不传,当前数组
    return total + currentValue // 最终返回的值,遍历时每次 return 的值,会成为下次遍历的 total
})
console.log('合计:', mul); // 合计:1500

for 循环实现

const arr = [100, 200, 300, 400, 500]
let mul = 0;
for (let i = 0; i < arr.length; i++) {
    mul += arr[i]
}
console.log('合计:', mul); // 合计: 1500
  1. 求最值
    arr.reduce() 方法实现
const arr = [100, 200, 300, 400, 500]

const max = arr.reduce((total, currentValue, index, arr) => {
    return Math.max(total, currentValue);
})
console.log('最大值:', max); // 最大值: 500

const min = arr.reduce((total, currentValue, index, arr) => {
    return Math.min(total, currentValue);
})
console.log('最小值:', min); // 最小值: 100

拓展运算符实现

const arr = [100, 200, 300, 400, 500]
console.log('最大值', Math.max(...arr)); // 最大值 500
console.log('最小值', Math.min(...arr)); // 最小值 100

有关javaScript 常用数组方法汇总的更多相关文章

  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-on-rails - 在 Ruby 中循环遍历多个数组 - 2

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

  6. 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

  7. Ruby 方法() 方法 - 2

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

  8. 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上找到一

  9. 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]

  10. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

随机推荐