js数组详解:
一. 数组的浅复制与深复制:
数组之间的复制,由于数组是引用类型,如果是字面量式复制,导致只要是改变其中一个数组的值两者都会发生变化,这种复制叫做浅复制。如果要想复制后不收影响,则需要深复制。深复制就是写一个函数,通过遍历把两者之间的值一一交换。
1.浅复制:
var arr = [];
for(var i = 0;i < 10;i++) {
arr.push(i+1);//装了个数而已
}
var array = arr;
arr[0] = 400;
alert(array[0]);//
2.深复制:
function deepCopy(arr1,arr2) {
for(var i = 0;i < arr.length;i++) {
arr2[i] = arr1[i];
}
}
var arr = [];
for(var i = 0;i < 10;i++) {
arr.push(i+1);
}
var array = [];
deepCopy(arr,array);
arr[0] = 100;
alert(array[0]);
二. 数组的查找
indexOf();lastIndexOf();用来查找数组中的参数是否存在,如果存在返回该参数的索引,不存在就返回-1;
三. 数组与字符串的转换:
jion()和toString();这两个方法可将数组形式转化成字符串,个元素用逗号隔开;
var arr = ["Wunworld",22,"assassin","intelwisd",67,90];
var array = arr.join();//Wunworld,22,assassin,intelwisd,67,90
var arra = arr.toString();//Wunworld,22,assassin,intelwisd,67,90
四.已有数组创建数组
concat()和splice();方法允许通过已有的数组创建新数组。concat()可以合并多个数组创建一个数组。splice()截取一个数组的子集创建一个数组。splice的一个参数是截取的其实索引值,第二个是截取的长度。
var arr1 = ["assassin",11,1,23,"Wunworld","intelwisd"];
var arr2 = ["wanghaifu","yangxian","son","daughter"];
var arr3 = arr1.concat(arr2);
alert(arr3); var arr = [1,2,3,4,5,6,7,8,9,10];
var array = arr.splice(3,5);
alert(array);//4,5,6,7,8
数组的可变函数:
一. 为数组添加元素:push()和unshift();
push();方法将一个元素添加的数组的尾部,unshift();将一个元素添加到数组的头部。添加元素时同样可以用length属性,arr[arr.leng-X] = 元素;这种插入式的添加很耗性能,添加到某一位时后面的都要后移。
二. 从数组中删除元素:pop()和shift();
pop();删除数组末尾的元素,shift();方法可以删除数组的第一个元素。
三. 从数组的中间位置添加和删除元素
删除数组的第一个元素和在数组开头添加一个元素存在同样的问题————都需要将数组的元素向前或向后移动,这时就用splice();方法:
1.起始索引
2.需要截取的个数(添加元素时0)
3.添加进去的数组元素
var arr1 = [1,2,3,7,8,9];
var arr2 = [4,5,6];
var arr3 = arr1.splice(3,0,arr2);
alert(arr3);//???空??? var arr1 = [1,2,3,7,8,9];
var arr2 = [4,5,6];
arr1.splice(3,0,arr2);
alert(arr1);//1,2,3,4,5,6,7,8,9
splice();用法总结:
1).用于截取数组构成新的数组
var arr = [1,2,3,4,5,6,7,8,9,10];
var array = arr.splice(3,5);
alert(array);//4,5,6,7,8
2).用于添加元素
splice(x,0,arr);//x:起始位置,arr:添加的数组
3).用于删除元素
splice(x,y);//x:起始位置,y:个数
1和3,其实是一样的只是对于不同的数组而言。
四. 数组的排序
reverse();该方法将数组中的元素顺序进行翻转
sort();对于sort()方法最好适用于字符的排序,要是进行数组排序(该方法是按照字典排序),调用一个比较大小的函数,简单的相减操作,一个数组减去另一个数字,如果为负数那么被减数小于减数;。。
function de(n1,n2) {
return n1-n2;
}
var arr = [11,3,56,78,990,44,56];
var arr2 = arr.sort(de);
alert(arr2);
另见排序总结:
五.数组的迭代方法;
一).不生成新数组的迭代器方法:
1).forEach();该方法接受一个函数作为参数,对与数组中的每一个元素使用该函数。
function square(num) {
alert(num*num);
}
var arr = [2,3,4,5,6,7];
arr.forEach(square);
2).every();该方法接受一个布尔类型的函数,读数组中的每一个元素使用该函数,如果对于所有的元素,该函数都(整体)返回true;否则false;
function isEven(num) {
return num % 2 == 0;
}
var arr = [2,4,6,8,10];
var even = arr.every(isEven);
if(even) {
alert("this num is even");
}else{
alert("this num is odd");
}//this num is even;
反例:
function isEven(num) {
return num % 2 == 0;
}
var arr = [2,3,10];
var even = arr.every(isEven);
if(even) {
alert("this num is even");
}else{
alert("this num is odd");
}//this num is odd;
两个例子说明every();接受的是一个布尔类型的一个函数,对于函数的整体进行判断。
3).some();该方法与every()方法相似,同样接受一个布尔类型的函数,读取数组的每一个元素,但只要有一个元素为真,则为真。
function isEven(num) {
return num % 2 == 0;
}
var arr = [2,3,5,7];
var even = arr.some(isEven);
if(even) {
alert("this num is even");
}else{
alert("this num is odd");
}//this num is even;
4)1.reduce();该方法接受一个函数,返回一个值,该方法会从一个累加值开始,不断的累加和数组中的后续元素调用该函数,知道数组中的最后一个元素。该函数和add();函数一起,从左到右,依次对数组中的元素求和。
function add(num1,num2) {
return num1+num2;
}
var arr = [1,2,3,4,5,6,7,8,9,10];
var nums = arr.reduce(add);
alert(nums);//
//1+2=3+3=6+4=10+5=15+6=21+7=28+8=36+9=45+10=55
2.reduce();该方法可以吧数组中的元素连接起来;
function add(num1,num2) {
return num1+num2;
}
var arr = ["Wunworld","assassin","is","man"];
var arr2 = arr.reduce(add);
alert(arr2);//Wunworldassassinisman;
3.reduceRight();该方法和reduce()方法相似只是从右往左执行。
二).生成新数组的迭代器方法:
//2016/12/22/
map()和filter();
map();与foreach();相似,该方法是对数组中的每一个元素使用某个函数,map();返回一个新的数组,是对原有的元素使用某一个函数的结果。
var arr = [1,2,3,4,0];
var newArr = arr.map(fn);
function fn(arr) {
return arr+5;
}
console.log(newArr); var str = ["Wunworld","Assassin","Intelwisd"];
var newStr = str.map(fn);
function Fn(str) {
return str[0];
}
alert(newStr);
filter();与every();相似,传入一个返回值为布尔类型的函数。与every()方法不同的是对的数组中的所有元素执行此函数,结果为true时并不返回true,而是返回一个新的数组,该数组包含使用函数后所对应的元素。
二维数组:
通过扩展JavaScript数组对象为其增加了一个新的方法,该方法通过设置传入新的数据设定了数组的行,列,初始值。
Array.matrix = function(rows,cols,initial) {
var arr = [];
for(var i = 0; i < rows; i++) {
var columns = [];
for(var j = 0; j < cols; j++) {
columns[j] = initial;
}
arr[i] = columns;
}
return arr;
}
//接受三个参数,行,列,初始的数据0,先定义一个空数组用来存放列元素,遍历行,再遍历中声明一个空的列数组,再进行遍历列,空的列数组进行初始化的赋值。列元素分别赋值给空数组,外侧返回二维数组即可。
var num = Array.matrix(5,5,0);
alert( num[1][1] );//
num = [ [1,2,3],[4,5,6],[7,8,9] ];
alert( num[1][2] );
层次不齐的函数:JavaScript对层次不起的数组表现很好,通过计算每一行的长度来实现。
eg:
var grades = [ [89,90],[109,109,76],[98,99,140,120,56],[79,70,45,67,99] ];
var totals = 0;
var average = 0.0;
for(var row = 0; row < grades.length; row++) {
for(var col = 0; col < grades[row].length; col++) {
total += grades[row][col];
}
average = total/grades[row].length;
alert( "student"+(row+1)+"average:"+average );
total = 0;
average = 0;
}
js数组详解:的更多相关文章
- js数组详解
1,什么是数组 数组是值得有序集合,每个值叫做一个元素,而每个元素在数组中有一个位置,以数字表示,称为索引.js的数组是无类型的,数组元素可以是任意类型,同一个数组中的不同元素可能是对象或数组 ...
- js 数组详解(javascript array)
Array Array 对象用于在单个的变量中存储多个值. 构造函数: 1) new Array(); 2) new Array(size); 3) new Array(element0, ...
- js数组详解,js数组操作
转自 http://www.cnblogs.com/qiantuwuliang/archive/2011/01/08/1930499.html 1.数组的创建 var arrayObj = new A ...
- 3.awk数组详解及企业实战案例
awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...
- js对象详解(JavaScript对象深度剖析,深度理解js对象)
js对象详解(JavaScript对象深度剖析,深度理解js对象) 这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕 ...
- JavaScript进阶(十)Array 数组详解
JS array 数组详解 数组的声明方法 arrayObj = new Array(); 的数组 ,并且第一位是5 数组的运算(传地址) var t2=new Array(); t2[0]=1; t ...
- (转)awk数组详解及企业实战案例
awk数组详解及企业实战案例 原文:http://www.cnblogs.com/hackerer/p/5365967.html#_label03.打印数组:1. [root@nfs-server t ...
- Java基础之 数组详解
前言:Java内功心法之数组详解,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) 数组概念 同一种类型数据的集合.其实数组就是一个容器. 数组 ...
- “全栈2019”Java第三十一章:二维数组和多维数组详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- 发工资了T_T
和哈比一起吃的四人餐 望京很好很和谐
- Lenovo k860i 移植Android 4.4 cm11进度记录【上篇已完结】
2014.5.16 为了验证一下下载的CM11的源码有没有问题,决定编译一下cm官方支持的机器,手上正好有台nexus7 2012,就拿它为例测试一下在mac os x平台的整个编译过程. 1. 最开 ...
- 紫书 习题 10-11 UVa 1646(斐波那契+高精度)
自己用手算一下可以发现是斐波那契数列,然后因为数字很大,用高精度 以后做题的时候记得算几个数据找规律 #include<cstdio> #include<cmath> #inc ...
- iOS数字媒体开发浅析
概述 自然界中的所有看到的听到的都是模拟信号,模拟信号是随时间连续变化,然而手机电脑等信息都属于数字媒体,它们所呈现的内容就是把自然界中这些模拟信号转换成数字信号然后再传递给我们.数字信号不是连续的是 ...
- Find problem in eXtremeDB
class table1 { char<8> f1; char<80> f2; uint4 f3; uint4 f4; double ...
- 在Unix上用 BIND建立名称服务器(naem server)
在Unix上用 BIND建立名称服务器(naem server) 安装 apt install -y bind9 yum install -y bind bind-utils 下载源码并解压缩,htt ...
- 线程池系列一:线程池作用及Executors方法讲解
线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数量 ...
- BZOJ1901 ZOJ2112 线段树+treap (线段树套线段树)
BZOJ1901: 线段树套线段树做法: (外层线段树 里层动态开节点的权值线段树) 有一个小小的trick 可以省掉二分变成nlog^2n的 就是把查询的区间都取出来- logn个一起走- 2016 ...
- jQuery - 设置内容和属性 设置内容 - text()、html() 以及 val() , 设置属性 - attr()
jQuery - 设置内容和属性 设置内容 - text().html() 以及 val() text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容(包括 HTM ...
- SCOPE_IDENTITY()和 SELECT @@IDENTITY 的用法
这俩个,是在插入数据的时候使用,返回刚刚插入数据行的ID 大家慎用@@IDENTITY,而尽量采用 SCOPE_IDENTITY() 函数替换之. SCOPE_IDENTITY() 也是得到最后一条 ...