JavaScript操作数组
数组被描述为一个存储元素的线性集合,元素可以通过索引来任意存取。
几乎所有的编程语言都有类似的数据结构,但是Javascript中的数组却略有不同。
Javascript中的数组是一种特殊的对象,所以在数组的操作效率上不如其他语言中的数组高。
也因为数组再JavaScript中被当做对象,所以它有很多属性和方法可以再编程时使用。
下面就简单介绍一下JavaScript中的数组的使用方法。
注:以下所有的JavaScript代码均在 jsshell 中运行,一些方法可能在其他环境中(如浏览器和sublime text)中不能运行。
【jsshell的使用】
/* Js-shell的使用 下载:http://mzl.la/MKOuFY 根据系统和语言选择不同版本进行下载,下载完直接打开js-shell终端进行使用 */ /**************** 在Js-shell中常用的一些Js方法 ***************/ print(); //打印页面/在终端直接打印 putstr(""); //显示提示信息 var num = readline(); //接受用户输入的信息
【 JavaScript中数组的操作】
/**************** JavaScript数组操作 ***************/ // 创建数组: var arr1 = []; var arr2 = [1,2,3,4,5]; var arr3 = new Array( ); var arr4 = new Array(10); var arr5 = new Array(1,2,3,4,5); // Js数组中的元素不必是同一种类型: var arr6 = [1,”西瓜”,null,true]; // 判断一个对象是否是数组: Array.isArray( arr ); //显示true/false // 读写数组 for(var i=0;i<num.length;i++){ print(num[i]); } // 由字符串生成数组split(分隔符) var sentence = "This is a sentence..."; var words = sentence.split(" "); //使用空格分割字符串并存在word数组中 //数组的操作 // 浅复制:新数组的依然指向原来的数组,修改原数组则新数组的内容跟着改变 var nums = [1,2,3,4,5]; var arr = nums; //直接讲nums赋值给arr nums[0] = 100; //修改nums数组第一个元素的内容 print(arr.[0]); //arr数组的第一个元素的内容也发生了改变 //深复制:即对原数组的每一个元素分别进行复制 for(var i=0;i<nums.length;i++){ arr[i] = nums[i]; } nums[0] = 999; print(arr[0]); //此时arr数组的第一个元素不发生改变,仍为1 // 数组的存取操作 //查找元素indexOf() 若找不到则返回-1 var names = ["Bob","Lily","John","Eileen","Sivan"]; var name = readline(); //用户输入一个要查找的名字 var position = names.indexOf(name); //函数返回的是被查找元素在数组中的索引 if(position>=0){ //如果用户查找的名字在数组中存在 print("Found " + name + " at position " + postion); }else{ print(name + " not found in array..."); } //lastIndexOf(); // 数组的字符串表示 //toString()方法 var days = ["Monday","Tuesday","Wednesday","Thursday"]; var days_string = days.toString(); print(days_stirng); //输出 Monday,Tuesday,Wednesday,Thursday //join()方法 var days_string1 = days.join(); print(days_join); //输出 Monday,Tuesday,Wednesday,Thursday print(days); //输出 Monday,Tuesday,Wednesday,Thursday //直接对一个数学使用print()方法时,系统会自动调用toString()方法 // 由已有数组创建新数组 var nums = [1,2,3,4]; var names = ['Jane','Sam','Mike','Bob']; var arr = nums.concat(names); print(arr); //输出 1,2,3,4,Jane,Sam,Mike,Bob //splice()截取数组创建新数组(对原数组会有影响) var numbers = [1,2,3,4,5,6,68,7]; var arr = numbers.splice(3,4); //从索引为3(第三个)的元素开始截取4个元素 print(arr); //输出4,5,6,68 //push()为数组末尾添加元素 var seasons = ["Summer","Autumn"]; var push = seasons.push("Winter"); //也同时添加多个元素 //unshift()为数组开头添加元素 var unshift = seasons.unshift("Spring"); //pop()删除数组末尾元素; var pop = seasons.pop(); //shift()删除数组开头的元素 var shift = seasons.shift(); // 从数组中间位置添加和删除元素 var nums = [1,2,3,4,6,7,8]; var addNums = [9,9,9]; nums.splice(2,0,addNums); print(nums); //输出1,2,9,9,9,3,4,5,6,7,8 //数组排序 //reverse()方法 var nums = [1,2,3,4]; var arr = nums.reverse(); print(arr); //输出4,3,2,1 //sort()方法 var name = ["Bob","Alice","Cindy"]; var arr = name.sort(); print(arr); //输出 Alice,Bob,Cindy //sort()方法只针对字符串根据字典顺序进行排序, //如果是数字类型,则需要传入一个比较函数作为参数 function compare(num1,num2){ return num1 - num2; } var nums = [1,32,45,12]; var arr = nums.sort(compare); //仅传入函数名称 print(arr); //输出1,12,32,45 /**************** 迭代器方法 ***************/ //forEach() 对数组中的每一个元素都执行某个方法 function square(num){ print(num,num*num); } var num = [1,2,3,4]; num.forEach(square); //输出1 1,2 4,3 9 //every()方法 接受一个返回值为bool类型的函数作为参数, // 若对于数组中所有元素,该函数均返回true,则该方法返回true function isEven(num){ return num % 2 == 0; } var nums = [2,4,6,8]; var even = nums.every(isEven); if(even){ print("All numbers are even..."); }else{ print("Not all numbers are even..."); } //输出"All numbers are even..." //some()方法 数组中只要有一个元素能使该函数返回true,该方法返回true function isEven(num){ return num % 2 == 0; } var nums = [2,3,4,5,6]; var even = nums.some(isEven); print(even); //输出true // reduce() // 对数组进行逐项累加 function add(runningTodal,currentValue){ return runningTodal + currentValue; } var nums = [1,2,3,4,5]; var sum = nums.reduce(add); print(sum); //输出15 // 将数组元素链接成一个长字符串 function concat(accumulatedString,item){ return accumulatedString + item; } var words = ["This","is","a","good","day"]; var string = words.reduce(concat); print(string); //输出"This is a good day" var string2 = words.reduceRight(concat); //从右到左执行 print(string2); //输出"day good a is This" /*生成新数组的迭代器方法*/ // map() 类似forEach(),对数组中的每一个元素都执行操作,但是返回的是一个新的数组 function curve(num){ return num+5; } var nums = [1,2,3,4]; var arr = nums.map(curve); print(arr); //输出 6,7,8,9 function first(word){ return word[0]; } var names = ["Alice","Bob","Cindy","Daniel"]; var arr = names.map(first); //结果为["A","B","C","D"] print(arr。join()); //输出"A,B,C,D" print(arr.join("")); //输出"ABCD" // filter() 传入返回值为bool类型的函数名作为参数,对数组中每个元素都执行函数, // 但是返回结果为使函数返回值为true的元素 //e.g 判断数组元素的奇偶性 function isEven(num){ return num %2 == 0; //偶数 } function isOdd(num){ return num %2 != 0; //奇数 } var num = []; for(var i=0;i<10;i++){ num[i] = i+1; } var evens = num.filter(isEven); print("Even numbers: "); print(evens); //输出2,4,6,8,10 var odds = num.filter(isOdd); print("Odd numbers: "); //输出1,3,5,7,9 print(odds); //e.g 判断成绩是否合格 function passing(num){ return num>=60; } var grade = []; for(var i=0;i<20;i++){ grade[i] = Math.floor(Math.random()*101); } var pass = grade.flter(passing); print("All grades: "); print(grade); print("Passing Grades: "); print(pass); //e.g. 过滤字符串数组 function del(str){ if(str.indexOf("cie")>-1){ return true; }else{ return false; } } var words = ["receive","decide","percieve","deceit","convince"]; var misspelled = word.filter(del); print(misspelled); //输出"percieve" /* 二维和多维数组 *JavaScript中支持一维数组,但是可以通过在数组元素中保存数组的方法来创建多维数组 */ // 创建二维数组 var num = []; var rows = 5; for(var i=0;i<rows;i++){ num[i] = []; //使数组中每个元素都是一个数组 } /* 上述方法存在的问题是:数组中的每个元素都是undefined,更好的方式是按照 * JavaScript:The good part(O'Reilly) 的例子,通过扩展js数组对象, * 新增一个方法,该方法根据传入的参数,设定了数组的行数、列数和初始值,如下: */ Array.martix = function(numrows,numcols,initial){ var arr = []; for(var i=0;i<numrows;i++){ var colnums = []; //定义列元素为数组 for(var j=0;j<numcols;j++){ colnums[j] = initial; //为元素的列赋值 } arr[i] = colnums; //使元素的每一行均为数组 } return arr; } //测试上述方法 var nums = Array.martix(3,4,0); print(nums[2][3]); //显示为0 //对于小规模的数据,可以直接创建二维数组如下: var nums = [[1,2,3],[4,5,6],[7,8,9]]; //处理二维数组(对于参差不齐的数组同样处理) var total = 0; var aver = 0; for(var row=0;row<nums.length;i++){ for(var col=0;col<nums[row].length;col++){ total += nums[row][col]; } aver = total / nums[row].length; print("total: "+total+"; "+"Averge: "+aver.toFixed(2)); total = 0; aver = 0.0; } /* 对象数组 */ function point(x,y){ this.x = x; this.y = y; } var p1 = new point(1,2); var p2 = new point(3,4); var p3 = new point(5,6); var p4 = new point(7,8); var points = [p1,p2,p3,p4]; print(points); //输出的是[object Object],[object Object],[object Object],[object Object] print(p1.x); //输出1 points.push(new point(9,0)); print(points[4].y); //输出0 points.shift(); print(points[0].x); //输出3 /* 数组对象 */ // 创建对象,保存气温,并求出气温的平均值 function weekTemps(){ //构造函数 this.dataStore = []; //创建空数组 this.add = add; this.average = average; } function add(temp){ this.dataStore.push(temp); //为数组中添加元素 } function average(){ var total = 0; for(var i=0;i<dataStore.length;i++){ total += this.dataStore[i]; } return total/this.dataStore.length; } var thisweek = new weekTemps(); thisweek.add(34); //像数组中添加元素 thisweek.add(43); thisweek.add(54); thisweek.add(30); thisweek.add(75); thisweek.add(66); thisweek.add(73); thisweek.add(56); print(thisweek.average); //输出平均温度值 /*JavaScript数组操作练习*/ // e.g.1 创建一个记录学生成绩的对象,提供一个添加成绩的方法,以及一个显示学生平均成绩的方法 function Grades(){ //构造方法用于初始化成绩信息 this.scores = []; this.add = add; this.aver = aver; } function add(score){ //添加成绩的方法 this.scores.push(score); } function aver(){ //显示平均成绩的方法 var total = 0; for(var i=0;i<scores.length;i++){ total += this.scores[i]; } return total / this.scores.length; } var grade = new Grades(); //创建成绩对象 grade.add(87); //逐个添加成绩数组中的元素 grade.add(98); grade.add(79); grade.add(86); grade.add(58); grade.add(73); print(grade.aver); //计算平均成绩 // e.g.2 将一组单词存储在一个数组中,并按正序和逆序分别显示这些单词 var words = ["Bob","Alice","Daneil","Cindy"]; var arr1 = words.sort(); print(arr1); //输出 Alice,Bob,Cindy,Daneil var arr2 = arr1.reverse(); print(arr2); //输出 Daneil,Cindy,Bob,Alice // e.g.3 修改前面的weekTemps对象,使它可以使用二维数组来存储每月的有用数据, // 增加一些方法用以显示平均数、具体某一周平均数和所有周的平均数 // e.g.4 创建这样一个对象,它将字母存储在一个数组中,并且用一个方法可以将字母 // 连在一起,显示成一个单词 function obj_letter(){ this.letters = []; this.add = add; this.linking = link; // 此处一定要将add方法也赋值,否则对象无法使用此方法,不同与Java中方法在类中, // 创建类对象可以直接使用类方法,在这里所有的方法都要身名称为对象的方法 } function add(item){ this.letters.push(item); } function linking(arr){ // return arr.join(); // 直接调用join()或toString()方法产生的数组字符串之间会有逗号。 return arr.join(""); } var obj = new obj_letter(); obj.add('h'); obj.add('e'); obj.add('l'); obj.add('l'); obj.add('o'); var word = obj.linking(obj.letters); print(word); //输出 hello /******************** The End *************************/