数组被描述为一个存储元素的线性集合,元素可以通过索引来任意存取。

几乎所有的编程语言都有类似的数据结构,但是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 *************************/

最新文章

  1. 让 select 的 option 标签支持事件监听(如复制操作)
  2. Maven打包程序
  3. 对话框AlertDialog.Builder使用方法
  4. ASP.NET MVC 随想录—— 使用ASP.NET Identity实现基于声明的授权,高级篇
  5. 让python在hadoop上跑起来
  6. RegExp 对象的三个方法:compile()、exec()、test()
  7. C语言 百炼成钢12
  8. iOS开发UI篇—程序启动原理和UIApplication1
  9. 【深度学习系列2】Mariana DNN多GPU数据并行框架
  10. Android菜鸟的成长笔记(28)——Google官方对Andoird 2.x提供的ActionBar支持
  11. KindEditor放在包含模版页的页面里不显示解决方案
  12. (译文)Python中的staticmethod与classmethod
  13. deeplearning.ai 改善深层神经网络 week3 超参数调试、Batch正则化和程序框架 听课笔记
  14. 《你不知道的 JavaScript 上卷》 学习笔记
  15. pyqt5 动画学习(三) 指定控件的移动轨迹
  16. layUI实现可选项 弹框
  17. [找工作] 2019秋招|从春招到秋招,Java岗经验总结(收获AT)
  18. robotframework编写用例
  19. linux环境下安装nginx步骤(不错)
  20. 剑指offer:滑动窗口的最大值

热门文章

  1. win7家庭版更改桌面图标
  2. HDU2824 The Euler function(欧拉函数)
  3. Codeforces 55D (数位DP+离散化+数论)
  4. PNG无损压缩工具Optipng【备忘】
  5. COJ969 WZJ的数据结构(负三十一)
  6. SSH框架优缺点
  7. uc_key getshell
  8. order by id asc得出的排序是什么原理
  9. 在树莓派上使用ss和iptables实现fq功能
  10. 【iM_VGA模块】运行 ucgui 演示!