【读书笔记】javascript之数组操作

一、使用数组

1.1 创建数组

  • 通过[ ]操作符声明一个数组变量:
var numbers=[];
  • 在生命数组变量时,直接在[]操作符内放入一组元素:
var numbers=[1,2,3,4,5];
  • 调用Array的构造函数创建数组,在调用Array的构造函数时,可以只传入一个参数,用来指定数组的长度:
var numbers=new Array(); //创建一个数组
var numbers= new Array([size]);

例子:

var numbers=new Array(10); 
print(numbers.length);
//创建一个数组并指定长度,注意不是上限,是长度;

Ps:可以调用Array.isArray()来判断一个对象是否是数组


1.2 读写数组

通过使用数组的length属性来控制循环次数,而不是直接使用数字。JavaScript中的数组也是对象,数组的长度可以是任意增长,超过其创建时指定的长度。length属性反映当前数组的元素个数。


1.3 由字符串生成数组

调用字符串对象的split()生成数组,通过分隔符比如单词空格将一个字符串分成几个部分,并将每部分作为一个元素保存在一个新建的数组中。

var sentence=“the little dog”;
var words=sentence.split();
for (var i=0;i<words.length;i++){
    print("word"+i+":"+words[i]);
}

输出为:

word 0: the
word 1: little
word 2: dog

1.4 对数组的整体性操作

主要分为两种方法:

  • 浅复制
    当一个数组赋给另一个数组时,只是为被赋值的数组增加一个新的引用,仿通过原引用修改数组的值时,另一个引用也会变化。
例子:
var nums=[];
for(var i=0;i<100;i++){
    nums[i]=i+1;
}
var samenums=nums;
nums[0]=400;
print(samenums[0]); //显示400
  • 深复制
    将原数组中的每一个元素都复制到一份到新数组中。
var nums=[];
for(var i=0;i<5;i++){
    nums[i]=i+1;
}
var samenums=[];
copy(nums,samenums);
nums[0]=400;
print(samenums[0]); //显示1

另一个将数组视为整体的操作是print()函数,用它可以显示数组中的元素。


二、存取函数

2.1 查找元素

  • indexOf()
    indexOf()函数是常用的存取函数,用来查找传进来的参数在目标数组中是否存在。若目标数组包含该参数,就返回该元素在数组中的索引;不包含,返回-1.

ps:数组中包含多个相同元素,indexOf()总返回第一个与参数相同的元素的索引。

  • lastIndexOf()
    该函数返回相同元素中最后一个元素的索引,若没找到相同元素,则返回-1;

2.2数组的字符串表示

两个方法都返回一个包含数组所有元素的字符串,各元素之间用逗号隔开
- join()
- toString()

var names=["hling","honey","sun"];
var namestr1=name.join();
print(namestr1);   //hling,honey,sun
var namestr2=name.toString();
print(namestr2);     //hling,honey,sun

ps:直接对数组使用print()函数时,系统会自动调用toString()方法。


2.3 由已有数组创建新数组

  • concat(); //发起者是一个数组,参数是另一个,注意是一个新的数组,不是指向

  • splice(); //从现有数组里截取一个新数组,可以为一个数组增加或者移除元素;


三、可变函数

3.1 为数组添加元素

push()将一个元素添加到数组末尾;
unshift()将元素添加到数组的开头;


3.2从数组中删除元素

pop()方法删除数组末尾的元素;(和push()一起,堆栈,后进先出),删除并返回数组的最后一个元素。
shift()方法可以删除数组,如果数组是空的,那么 shift() 方法将不进行任何操作,返回 undefined 值,删除并返回数组的第一个元素。


3.3为数组排序

  • reverse()
    该方法将数组中元素的顺序进行翻转;
  • sort()
    sort()方法按照字典顺序对元素进行排序,因此假定的是字符串类型.
var nums=[3,1,2,100,4,200];
nums.sort();
print(nums);
//1,100,2,200,3,4

为了让sort()方法也能排序数字类型,可以再调用方法时传入一个大小比较函数。通过比较函数中两个元素的大小,从而决定整个数组的大小。

function compare(num1,num2){
    return num1-num2;
    //num1-num2递增顺序,若num2-num1位递减顺序;
}
var nums=[3,1,2,100,4,200];
nums.sort(compare);
print(nums);
//1,2,3,4,100,200

四、迭代器方法

迭代器方法对数组中的每个元素应用一个函数,可以返回一个值、一组值或者一个新数组。

4.1不生成新数组的迭代器方法

  • forEach()

该方法接受一个函数作为参数,对数组中的每个元素使用该函数。

function aquare(num){
    print(num,num*num);
}
var nums=[1,2,3];
nums.forEach(square);

//程序输出为:
1 1
2 4
3 9

  • every()
    该方法接受一个返回值为布尔类型的函数,对数组中的每个元素使用该函数。对于所有的元素,该函数返回true,只要有一个元素返回false,则该方法返回false。
function isEven(num){
    return num %2==0;
}
var nums=[2,4,6];
var even=nums.every(isEven);
if(even){
    print("all numbers are even");
}
else{
    print("not all numbers are even");
}
//输出为:
all numbers are even
//将数组换为var nums2=[2,3,4,6];则输出结果则为:
not all numbers are even

  • some()
    some()方法接受一个返回值为布尔类型的函数,只要有一个元素使得该函数返回true, 该方法返回true。
function isEven(num){
    return num%2==0;
}
var nums=[1,2,3,4,5,6];
var someEven=nums.some(isEven);
if(someEven){
    print("Some numbers are even");
}
else{
    print("No numbers are even");
}
nums=[1,3,5,7,9];
someEven=nums.some(isEven);
if(someEven){
    print("Some numbers are even");
}
else{
    print("No numbers are even");
}
//该程序的输出为:
Some numbers are even
No numbers are even

  • reduce
    该方法接受一个函数,返回一个值。该方法会从一个累加值开始,不断对累加值数组中的后续元素调用该函数,直到数组中的最后一个元素,最后返回得到的累加值。reduce()方法可以将数组中的元素连接成一个长的字符串。
function add(runningTotal,current){
    return runningTotal+currentValue;
}
var nums=[1,2,3,4,5];
var sum=nums.reduce(add);
print(sum);
//显示结果为55

JavaScript有reduceRight()方法,和reduce()不同的是它从右到左执行。


4.2 生成新数组的迭代器方法

map()

对数组中的每个元素使用某个函数,与forEach()类似,区别在于map()返回一个新的数组,该数组的元素是对原有元素应用某个函数得到的结果。

function first(word){
    return word[0];
}
var words=["for","your","information"];
var acronym=words.map(first);
print(acronym.join(""));
//join()方法,可以传入一个空字符串作为参数

//显示结果为:"fyi"

filter()
filter()和every()类似,传入一个返回值为布尔类型的函数。与every()不同的是,当对数组中所有元素应用该函数时,结果均为true时,该方法并不返回true,而是返回一个新数组,该数组包含应用该函数后结果为true的元素。filter()方法还可以过滤字符串数组。


五、二维数组和多维数组

5.1创建二维数组

需要先创建一个数组,再让数组的每个元素也是一个数组。

创建多维数组的源码:

Array.matrix=function(numrows,numcols,initial){
    var arr=[];
    for(var i=0;i<numrows;++i){
        var columns=[];
        for(var j=0;i<numcols;++j){
            columns[j]=initial;
        }
    arr[i]=columns;
    }
    return arr;
}

5.2处理二维数组的元素

有两种基本的访问方式:按列访问和按行访问;row行,col列。

var grades=[[89,77,78],76,82,81]];
var total=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;
    print("student "+parseInt(row+1)+" average:"+average.toFixed(2));
    total=0;
    average=0.0;
}
程序输出为:
student 1 average:81.33
student 2 average:79.67

toFixed(n)保留到小数后n位,grades[row].length使用数组的length属性判断每行包含多少列


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值