JavaScript-数组操作方法

JS数组

1.1创建数组

var arr = [] 字面量形式
var arr = new Array() 构造器形式 (可以省略new)

只传入一个数字参数:
var arr = new Array(100) 表示创建一个名为arr的长度为100的新数组

传入多个参数:
var arr = new Array(1,2,3) 等同于 var arr = [1, 2, 3]

1.2 数组操作

1.2.1 数组元素读写

var arr = [1, 2, 3, 4, 5]

arr[1];  //2
arr.length;  //5
arr[5] = 6;
arr.length;  //6
  • 删(用delete时的情况)被删除的元素值变为undefined,索引号也被删除,但被删除的元素仍然占据一个位置,数组长度不变
delete arr[0];
arr[0];   //undefined
//用in操作符来判断索引号在数组中是否存在
0 in arr;  //false 表示索引号也被删除
arr;    //[undefined, 2, 3, 4, 5, 6]
arr.length;  //5

1.2.2 数组元素增删

除了上面用索引号的方法增删外,还有四种增删数组头尾元素的方法

arr.pop()  尾部删除  也可以用 arr.length = arr.length - 1
arr.push() 尾部增加  也可以用 arr[arr.length]
arr.shift() 头部删除
arr.unshift() 头部增加

1.2.3数组迭代

for循环迭代

for循环最常用的地方是利用索引来遍历数组:

var arr = [1, 2, 3, 4, 5]
for (var i = 0; i < arr.length; i++) {
    console.log(arr[i]);  //1,2,3,4,5
}
for … in

for循环的一个变体是for … in循环,它可以把一个对象的所有属性依次循环出来:
(注意:for in 会把原型链上面的属性也循环出来)

var arr = [1, 2, 3, 4, 5];
for (var i in arr) {
    console.log(arr[i]) //1,2,3,4,5
}
Array.prototype.x = 'hello'
for (var i in arr) {
    console.log(arr[i])  //1,2,3,4,5,hello
}

要过滤掉对象继承的属性,用 if语句 + hasOwnProperty() 来实现:

for (var i in arr) {
    if(arr.hasOwnProperty(i)){
        console.log(arr[i])  //1,2,3,4,5
    }
}

for … in循环由于历史遗留问题,它遍历的实际上是对象的属性名称。一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性。

当我们手动给Array对象添加了额外的属性后,for … in循环将带来意想不到的意外效果,for … in循环将把name包括在内,但Array的length属性却不包括在内。

a.name = 'Hello';
for (var x in a) {
    console.log(x); // '0', '1', '2', 'name'
}
for … of 循环 完全修复上面的问题,它只循环集合本身的元素:
var a = ['A', 'B', 'C'];
a.name = "hello";
for(var x of a) {
    console.log(x);  //'A', 'B', 'C'
}

1.3 二维数组

var arr =[[0, 1], [2, 3], [4, 5]];
var i = 0;
var row;
for (; i < arr.length; i++) {
  row = arr[i];
  console.log('row' + i);
  for (var j = 0; j < row.length; j++) {
    console.log(row[j]);
  }
}

1.4 稀疏数组

数组元素的索引不一定要连续的,它们之间可以有空缺。每个javaScript数组都有一个length属性。针对非稀疏数组,该属性就是数组元素的个数;针对稀疏数组,length比所有元素的个数要大。

1.5 数组方法

1.5.1 join() 将数组转化为字符串 原数组未被修改

join()方法是一个非常实用的方法,它把当前Array的每个元素都用指定的字符串连接起来,然后返回连接后的字符串:

var arr = [1, 2, 3];
arr.join();  //"1,2,3"
arr.join("-");    //'1-2-3'

自己写一个重复字符串的函数

function repeatString(str,n) {
    return new Array(n + 1).join(str);
}
repeatString('Hi', 3);   /// "HiHiHi"

1.5.2 reverse() 将数组逆序 原数组被修改

var arr = [1, 2, 3]
arr.reverse(); // [3, 2, 1]
arr; //[3, 2, 1]

1.5.3 sort() 排序 原数组被修改

默认按照字母顺序排序

var arr = ["a", "d", "c", "b", ]
arr.sort();  //["a", "b", "c", "d", ]

数字在排序时是转化成字符串再进行排序,所以开头是3的数字排在了开头是5的数字的前面,这和我们想要的效果不一致。

arr = [13, 24 ,51, 3];
arr.sort();   //[13, 24, 3, 51]
arr;  //[13, 24, 3, 51]   

所以我们要自己编写一个函数,用来实现数字排序

arr = [13, 24 ,51, 3]
arr.sort(function(a, b) {
    return a - b  //升序排列
    return b - a  //逆序排列
})

比较对象中的数值大小

arr = [{age: 25}, {age: 59}, {age: 44}]
arr.sort(function(a, b) {
    return a.age - b.age;
});
arr.forEach(function(item) {
    console.log('age',item.age)
})
//age 25
//age 44
//age 59

1.5.4 concat() 数组合并 原数组未被修改

concat()方法把当前的Array和另一个Array连接起来,并返回一个新的Array:

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

可以传递数组作为参数,传递进去的数组会被拉平,
arr.concat([10, 11], 13); //[1, 2, 3, 10, 11, 13]
但只会拉平一次:
arr.concat([1, [2, 3]]); //[1, 2, 3, 1, [2, 3]]

1.5.5 slice() 返回部分数组 原数组未被修改 对应字符串操作str.substring(x,y)

var arr = [1,2,3,4,5];
arr.slice(1, 3);   //[2, 3]  两个参数均表示索引号,左闭右开区间
arr.slice(1); //[2,3,4,5] 只有一个参数表示从第几个索引开始取,取到结束
arr.slice(1, -1);  //[2,3,4]    -1表示逆序的第一个元素5
arr.slice(-4, -3);  //[2]
arr;  //[1,2,3,4,5]

1.5.6 splice() 数组拼接 原数组被修改

splice()方法是修改Array的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素:

var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
// 从索引2开始删除3个元素,然后再添加两个元素:
arr.splice(2, 3, 'Google', 'Facebook'); // 返回删除的元素 ['Yahoo', 'AOL', 'Excite']
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
// 只删除,不添加:
arr.splice(2, 2); // ['Google', 'Facebook']
arr; // ['Microsoft', 'Apple', 'Oracle']
// 只添加,不删除:
arr.splice(2, 0, 'Google', 'Facebook'); // 返回[],因为没有删除任何元素
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']

从这里开始下面的这些方法,都是 ECMA5 的新特性,IE9+支持

1.5.7 forEach() 数组遍历

forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。
var arr = [1,2,3,4,5];
arr.forEach(function(x, index, a) {
console.log(x + ‘|’ + index + ‘|’ + (a === arr));
});

//result 第一个参数是数组的成员,第二个是索引,第三个是数组本身
1|0|true
2|1|true
3|2|true
4|3|true
5|4|true

1.5.8 map() 数组映射 原数组未被修改

var arr = [1,2,3];

arr.map(function(x) {
  return x + 10;
});  // [11,12,13]

arr;  //[1,2,3]  原数组未被修改

1.5.9 filter() 数组过滤 原数组未被修改

筛选出来索引号是模3为0的,或者大于等于8的元素

var arr = [1,2,3,4,5,6,7,8,9,10];
arr.filter(function(x, index) {
    return index % 3 === 0 || x >= 8;
});   //return [1,4,7,8,9,10]
arr; //[1,2,3,4,5,6,7,8,9,10]  原数组未被修改

1.5.10 every & some 数组判断

every() 数组中是否每一个元素都符合某条件
var arr = [1,2,3,4,5];
arr.every(function(x) {
    return x < 10;
});  //true

arr.every(function(x) {
    return x < 3;
}); //false
some() 数组中是否存在某元素符合某条件
var arr = [1,2,3,4,5];
arr.some(function(x) {
    return x === 3;
});  //true

arr.some(function(x) {
    return x === 100;
});  //false

1.5.11reduce & reduceRight

reduce() 数组元素进行两两操作,最终得到一个值

运行逻辑: 传入的第二个参数0,作为第一次运算操作的x,数组第一个元素作为y,得到的结果成为下一次运算的x,数组的下一个元素作为下一次运算的y。
即 0+1=1 1+2=3 3+3=6 ,最终输出 6
如果不传入第二个参数,则第一次运算的x和y分别是数组的第一个和第二个元素

var arr = [1,2,3];
var sum = arr.reduce(function(x, y) {
    return x + y
}, 0); //6
arr;  // [1,2,3]

arr = [3, 9, 6];
var max = arr.reduce(function(x, y) {
    console.log(x + "|" + y);
    return x > y ? x : y;
});
// 3|9
// 9|6
max; //9
reduceRight()和reduce()的区别是: 从右到左进行遍历

1.5.12 indexOf & lastIndexOf 数组索引

indexOf 从左向右找
var arr = [1,2,3,2,1];
arr.indexOf(2); //1     找2,结果为索引为1的位置
arr.indexOf(99); //-1   找不到返回-1
arr.indexOf(1, 1); //4  找1,从索引为1的地方开始找,结果为索引为5的位置
arr.indexOf(1, -3);//4  找1,从倒数第3个元素的地方开始向左找,结果仍为索引为5的位置
arr.indexOf(2, -1);//-1  找2,从最右开始往左找,找不到
lastIndexOf 从右向左找
arrlastIndexOf(2); //3  找2 从最右开始往左找,结果为索引为3的位置
arrlastIndexOf(2, -2); //3 找2,从倒数第2个元素开始找,结果为索引为3的位置
arrlastIndexOf(2, -3); //1 找2,从倒数第2个元素开始找,结果为索引为1的位置

1.5.13 Array.isArray() 判断是否为数组

上面的方法都是在 Array.prototype这个原型对象上,而isArray是在Array构造器上的,所以必须用Array这个构造器对象 + .isArray的方式来进行调用

Array.isArray([]); //true

判断是否是数组的其他方法

[] instanceof Array;   //true
({}).toString.apply([]) === '[object Array]';    //true
[].construtor === Array;    //true
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
大学生在线租房平台管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、报修评价管理、字典管理、房东管理、房屋管理、房屋收藏管理、房屋留言管理、房屋租赁管理、租房论坛管理、公告信息管理、留言板管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生在线租房平台管理系统可以提高大学生在线租房平台信息管理问题的解决效率,优化大学生在线租房平台信息处理流程,保证大学生在线租房平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理大学生在线租房平台信息,包括房屋管理,培训管理,报修管理,薪资管理等,可以管理公告。 房屋管理界面,管理员在房屋管理界面中可以对界面中显示,可以对房屋信息的房屋状态进行查看,可以添加新的房屋信息等。报修管理界面,管理员在报修管理界面中查看报修种类信息,报修描述信息,新增报修信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值