热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于javascript:javascript基础之数组

javascript数组:繁多变量存储多个值数组每个值叫做一个元素,而每个元素在数组中有一个地位,以数字示意,称为索引。数组是值的有序汇合固定长度能够寄存不

Javascript 数组: 繁多变量存储多个值

数组每个值叫做一个元素,而每个元素在数组中有一个地位,以数字示意,称为索引。

  1. 数组是值的有序汇合
  2. 固定长度
  3. 能够寄存不同的数据结构
  4. 一段线性调配的内存.

罕用办法

属性 名称 阐明
length 长度办法 长度办法
名称 阐明
concat() 连贯两个或多个数组,并返回已连贯数组的正本。
copyWithin 将数组中的数组元素复制到指定地位或从指定地位复制。
entries 返回键/值对数组迭代对象。
every 查看数组中的每个元素是否通过测试。
fill 用动态值填充数组中的元素。
filter 应用数组中通过测试的每个元素创立新数组。
find 返回数组中第一个通过测试的元素的值。
findIndex 返回数组中通过测试的第一个元素的索引。
forEach 为每个数组元素调用函数。
from 从对象创立数组。
includes 查看数组是否蕴含指定的元素。
indexOf 在数组中搜寻元素并返回其地位。
isArray 查看对象是否为数组。
join 将数组的所有元素连接成一个字符串。
keys 返回 Array Iteration 对象,蕴含原始数组的键.
lastIndexOf 在数组中搜寻元素,从开端开始,并返回其地位。
map 应用为每个数组元素调用函数的后果创立新数组。
pop 删除数组的最初一个元素,并返回该元素。
push 将新元素增加到数组的开端,并返回新的长度。
reduce 将数组的值减为单个值(从左到右)。
reduceRight 将数组的值减为单个值(从右到左)。
reverse 反转数组中元素的程序。
shift 删除数组的第一个元素,并返回该元素。
slice 抉择数组的一部分,并返回新数组。
some 查看数组中的任何元素是否通过测试。
sort 对数组的元素进行排序。
splice 从数组中增加/删除元素。
toString 将数组转换为字符串,并返回后果。
unshift 将新元素增加到数组的结尾,并返回新的长度。

详解

slice 函数

截取数组中的几个元素 组成新的数组

  1. slice(start,end)示意从下标start开始到下标end(不包含end)进行截取,失去的是一个新数组,不扭转原数组。
  2. 当start为负值时示意从倒数第几个元素开始往后截取
  3. 不填end的话就示意从倒数第几个元素开始截取,始终截取到数组开端元素。
// 简略复制,浅拷贝
var _array = [1,2,3,4,5]
var copyArray = _array.slice();

// 获取从 N 开始的子数组
// 心愿弹出数组的第一个元素并应用它,返回残余的数组,但心愿在不批改原始数组的状况下执行此操作。
function useone (arr) {
  const usedItem = arr[0]
  return arr.slice(1)
}

// 获取从开端 N 开始的子数组,负索引使删除任意数量的元素变得简略
const sliceArr = _array.slice(-3)
console.log('sliceArr ',sliceArr) //[3,4,5]

// 获取数组的前n个
const first4 = _array.slice(0, 4) // [1,2,3,4]

// 获取数组中某段子数组
function getSegement(arr, begin, length) {
  return arr.slice(begin, begin + length);
}
console.log(getSegement(_array,1,3)) // [2,3,4]

// 相似数组的对象转换
Array.prototype.slice.call(arguments)

// 批改数组中的特定索引
// slice在函数上下文中一个弱小而常见的用法是替换数组中特定项的值。从实质上讲,这很简略,只须要调配新值,然而在函数世界中,不能批改原始数组。相同,能够将slice与扩大运算符一起应用,以返回一个雷同但对于要更新的​​索引的新数组:
function replaceIdx(arr,index,newVal) {
    return [
        ...arr.slice(0,index),
        newVal,
        ...arr.slice(index+1)
    ]
}

// 偏函数利用
var partial = function() {
  const fn = arguments[0];
  const args = Array.prototype.slice.call(arguments, 1);

  // Return a function that calls fn
  return function() {
    var remainingArgs = Array.prototype.slice.call(arguments);
    return fn.apply(this, args.concat(remainingArgs));
  }
}

// 将任意长度多余的参数强制转换为数组
function myFunc(a, b) { 
  const extraArgs = Array.prototype.slice.call(arguments, 2); 
}
myFunc(1, 2, 3, 4, 5, 6, 7, 8) // 失去a == 1,b === 2,extraArgs=== [3,4,5,6,7,8]

splice 函数

splice()办法有三个参数,别离示意从哪个下标开始,删几个元素。能够实现减少,删除,替换数组元素的性能。arr.splice(-5,5)示意从倒数第五个元素开始,删五个元素。奇妙的是该办法的返回值是删除的元素汇合。同时该办法扭转了原数组。原数组变成了除了删除的元素剩下的元素汇合。

var numbers = [1,2,3,'hello','Javascript',33,'world', {"name":"wxh","age":33}];

// 复制数组
var _array = [];


console.log(numbers.splice(0,2,'a','b','c')) // [ 1, 2 ]
console.log(numbers) // [ 'a','b','c', 3,'hello','Javascript',33,'world',{ name: 'wxh', age: 33 } ]

forEach 函数

//规范
forEach(callback[,thisArg])

//简略示例
Array.forEach(function(item, index, array){
    //回调函数内容
}, args);

// 扩大
if (!Array.prototype.forEach) {
    Array.prototype.forEach = function (callback, thisArg) {
        for (var i = 0; i 

filter 函数

3个参数同forEach,args也同forEach,惟一不同的是,函数有回调函数里有return返回值。

  1. 简略来说,该办法返回值是一个数组。
  2. 初始时,这个数组是空数组,该办法会通过回调函数遍历整个数组(指Array这个),
  3. 如果以后的元素返回值为true(或者能够隐式转换为true的,比方一个长度大于0的字符串),
  4. 那么会将以后元素增加到被返回的数组中。

例如:[1, 2, 3],
回调函数的return是item > 1, 
当第一个元素1时,1>1为false,因而不会增加到返回的数组中,
而2和3 >1显然是true,因而会被增加到数组中。最终,返回值是[2,3]。

//规范
filter(callback[,thisArg])

//简略示例
Array.filter(function(item, index, array){
    //回调函数内容
}, args);

// 扩大
if (!Array.prototype.filter) {
    Array.prototype.filter = function (callback, thisArg) {
        var temp = [];
        for (var i = 0; i 

map 函数

3个参数同forEach,args也同forEach,惟一不同的是,函数有回调函数里有return返回值。
简略来说,该办法的返回值也是一个数组(类filter);

  1. 和filter的区别在于,filter是将原数组元素,选择性退出到新数组中。
  2. map是将原数组的每个元素,进行解决后,放到新数组中。

例如:[1,2,3]作为原数组,map回调函数内的代码为:
return item + 10;
那么就相当于将1+10放到数组中,而后将2+10放到数组中,再将3+10放到数组中。
后果为:[11, 12, 13]
当然,也能够写更简单的逻辑,比方if(item>3)时+10,而后else if(item>2)时+5,否则else -10
那么后果就是[-9, 7, 13]

//规范
map(callback[,thisArg])

//简略示例
Array.map(function(item, index, array){
    //回调函数内容
}, args);

// 扩大
if (!Array.prototype.map) {
    Array.prototype.map = function (callback, thisArg) {
        var temp = [];
        for (var i = 0; i 

reduce 函数

首先看回调函数,他有四个参数,
item是以后元素,别的中央写的是currentValue示意以后值,为了不便了解,我这里写item和下面对立格调
index是以后元素的索引;
Array是整个数组(能够通过这个批改源数组);
下面3个都很好了解。

第一个参数previousValue是外围。他示意上一次执行回调函数时的返回值。
例如,有数组[1, 2, 3, 4]
当我遍历到第二个元素时,回调函数的previousValue的值是1,item的值为2,
return我写为:return previousValue + item
那么当遍历到第三个元素时,回调函数的previousValue的值则为3(因为1+2),item的值为3
当遍历到第四个元素时,previous的值则为6(因为3+3),
最终reduce的返回值为10(因为6+4)

那么问题来了,为什么没提到遍历第一个元素?
起因是,当reduce没有第二个参数时,遍历从数组的第二个元素开始,
第一次执行回调函数的previousValue的值是数组第一个元素的值

当reduce存在第二个参数时(哪怕是null或者undefined),遍历都将从第一个元素开始;
第一次执行回调函数时(遍历第一个元素),previousValue的值是第二个参数的值,而item是第一个元素的值

所以在应用的时候须要留神,如果须要执行和数组元素个数一样次数的回调函数,那么必须设置reduce的第二个参数;
如果不设置,那么回到函数次数执行的次数,将比数组元素个数少1。

//规范
reduce(callback[,initialValue])

//简略示例
arr.reduce(function (previousValue, item, index, Array) {
    return xxx;    //xxx示意省略
});

// 扩大
if (!Array.prototype.reduce) {
    Array.prototype.reduce = function (callback, initialValue) {
        var previousValue = initialValue || this[0];//如果不指定intialValue,则默认为数组的第一个元素
        //如果不指定initialValue(即第二个参数),i从1(第二个元素)开始遍历,否则就从0(第一个元素)开始遍历
        for (var i = initialValue ? 0 : 1; i 

reduceRight 函数

//规范
reduceRight(callback[,initialValue])

//简略示例
arr.reduceRight(function (previousValue, item, index, Array) {
    return xxx;    //xxx示意省略
});
// 扩大
if (!Array.prototype.reduceRight) {
    Array.prototype.reduceRight = function (callback, initialValue) {
        var previousValue = initialValue || this[this.length - 1];//如果不指定intialValue,则默认为数组的第一个元素
        //如果不指定initialValue(即第二个参数),i从1(第二个元素)开始遍历,否则就从0(第一个元素)开始遍历
        for (var i = (initialValue ? this.length - 1 : this.length - 2); i > -1; i--) {
            //previousValue 累加每一次返回的后果
            if (this[i])
                previousValue = callback(previousValue, this[i], i, this);
        }
        return previousValue;
    }
}

every 函数

返回值是true或者false
初始状况下是true;
而后遍历数组,有一个不满足,则为false,并且终止遍历过程。
回调函数的this仍然默认指向window,或者是every的第二个参数。

空数组的every返回后果是true。

//规范
every(callback, thisArg);

//简略示例
arr.every(function(item, index, array){
    return item > xx;
});

if (!Array.prototype.every) {
    Array.prototype.every = function (callback, thisArg) {
        var result = true;
        for (var i = 0; i 

indexOf 函数

用于查找第一个参数是否在数组中;
如果不在,返回-1;
如果在,返回在数组中遇见的第一个的下标;
例如:[1,2,3,2].indexOf(2)的返回值是1,尽管第二个和第四个元素都是,然而先遇见第二个,而第二个的下标是1

如果indexOf有第二个参数,那么从数组中第二个参数所指向的下标地位开始往后找;
例如:[1,2,3,2].indexOf(2,2)的返回值是3,因为开始下标是2(即第三个元素3),因而从第三个开始,遇见的第一个2的下标是2;
判断时含第二个参数所指向的数组元素

//规范
arr.indexOf(searchElement, fromIndex);

//简略示例
[1,2,3].indexOf(2);    //1(数组的第二个元素)
[1,2,3].indexOf(4);    //-1(未找到,留神,-1不是false,隐式转换后他的值为true)

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (searchElement, fromIndex) {
        var result = -1;
        for (var i = fromIndex ? fromIndex : 0; i 

lastIndexOf 函数

//规范
arr.lastIndexOf(searchElement, fromIndex);

//简略示例
[1,2,1].lastIndexOf(1);    //2
[1,2,1].lastIndexOf(1, 1);    //0

if (!Array.prototype.lastIndexOf) {
    Array.prototype.lastIndexOf = function (searchElement, fromIndex) {
        var result = -1;
        for (var i = (fromIndex ? fromIndex : this.length - 1); i > -1; i--) {
            if (this[i]) {
                if (searchElement === this[i]) {
                    result = i;
                    break;
                }
            }
        }
        return result; //所有元素都符合条件,返回true
    }
}

from 函数

Array.from() 从类数组对象或者可迭代对象中创立一个新的数组实例。

console.log(Array.from([1,2,3],x=>x*x)); // 2,4,9

Array.isArray() 用来判断某个变量是否是一个数组对象。

console.log(Array.isArray(Array.from([1,2,3]))); // true

Array.of() 依据一组参数来创立新的数组实例,反对任意的参数数量和类型。

console.log(Array.of(1, 2, 3));// [1,2,3]

concat 函数

连贯两个或更多的数组,并返回后果

var arr = [ 1, 2, 3 ];
var arr2= arr.concat("4", "5", "6");   //["1", "2", "3", "4", "5", "6"];

join 函数

把数组的所有元素放入一个字符串并通过指定的分隔符进行分隔

arr.join("+");   //"1+2+3";

reverse 函数

反转数组中元素的程序。

arr.reverse(); 
console.log(arr);   // [3, 2, 1];

sort 函数

数组排序 依照字符串的形式来排序。

toString 函数

把数组转换为字符串,并返回后果

find 函数

返回传入一个测试条件,符合条件的数组第一个元素,当数组中的元素在测试条件时返回true时, find() 返回符合条件的元素,之后的值不会再调用执行函数。如果没有符合条件的元素返回 undefined

const pets = [
  { type: 'Dog', name: 'Max'},
  { type: 'Cat', name: 'Karl'},
  { type: 'Dog', name: 'Tommy'},
];

var pet = pets.find(pet => pet.type ==='Dog' && pet.name === 'Tommy');
console.log(pet); // { type: 'Dog', name: 'Tommy' }

some 函数

用于检测数组中的元素是否满足指定条件,如果有一个元素满足条件,则表达式返回true, 残余的元素不会再执行检测,如果没有满足条件的元素,则返回false。

let arr = [1, 2, 3, 4, 5]
console.log(arr.some(item => item === 2)); // true

// ES5循环实现 some 办法
const selfSome = function (fn, context) {
    let arr = Array.prototype.slice.call(this) // 复制数组原型对象
    // 空数组间接返回 false,数组的 every 办法则相同返回 true
    if(!arr.length) return false
    for (let i = 0; i  item === 2)) // true

数组与字符串转换

var arr = ['wxh','cjk','dbt','cjk']
console.log(arr.join(",")) // 以 逗号 进行宰割
Array.from(new Set(arr)) // ['wxh','cjk','dbt']  // 数组去重

var str = "wxh,cjk,dbt"
console.log(str.split(","))
console.log(Array.from(str)) // ['w', 'x', 'h', ',',....]

数组与对象转换

let arrayLike = {
'0': 'wxh',
'1': 'cjk',
'2': 'dbt',
length: 3
};
// ES5 的写法
var arr1 = [].slice.call(arrayLike); // ['wxh', 'cjk', 'dbt']

// ES6 的写法
let arr2 = Array.from(arrayLike); // ['wxh', 'cjk', 'dbt']

// NodeList 对象
let arr3 = document.querySelectorAll('p');
Array.from(arr3).forEach(function (item) {
  console.log(item);
});

// arguments 对象
function foo() {
  var args = Array.from(arguments);

}

推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
author-avatar
手机用户2602903375
这个家伙很懒,什么也没留下!