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 *************************/
JavaScript操作数组的更多相关文章
- javaScript操作数组的常用方法
map(映射), reduce(规约), forEach(遍历), filter(过滤),它们都是高阶函数,都是以传入不同的函数来以不同的方式操作数组元.ie都不支持 判断是否为数组 Array.is ...
- JavaScript操作数组。
1.shift:删除原数组第一项,并返回删除元素的值,原数组为空则返回undefined. 2.unshift:将参数添加到原数组开头,并返回数组的长度. 3.pop:删除原数组最后一项,并返回删除元 ...
- JavaScript中数组操作常用方法
JavaScript中数组操作常用方法 1.检测数组 1)检测对象是否为数组,使用instanceof 操作符 if(value instanceof Array) { //对数组执行某些操作 } 2 ...
- 关于javascript里面仿python切片操作数组的使用方法
其实在使用了好一段时间的 python之后,我觉得最让我念念不忘的并不是python每次在写函数或者循环的时候可以少用{}括号这样的东西(ps:其实也是了..感觉很清爽,而且又开始写js的时候老是想用 ...
- 让操作javascript对象数组像.net lamda表达式一样
让操作javascript对象数组像.net lamda表达式一样 随着web应用程序的富客户端化.ajax的广泛使用及复杂的前端业务逻辑.对js对象数组.json数组的各种操作越来越多.越来越复杂. ...
- [转]javascript之数组操作
javascript之数组操作 .数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个 ...
- javascript 红宝书笔记之如何使用对象 如何操作数组
对象定义 === 引用类型,描述的是一类对象所具有的属性和方法 新对象的创建 方法 new + 构造函数 var person = new Object(); 对象字面 ...
- javascript中slice() splice() concat()操作数组的方法
这三个操作数组,哪个返回一个新数组呢.上代码 splice()方法,用于插入,删除和替换. var arr=[1,2,3,4,5]; var arr1=arr.splice(1,3); console ...
- javascript之操作数组方法
掌握如何操作数组,会让你的开发变得更加高效 1.栈和队列方法(以下四个方法都改变原数组) arr.push() //接受任意类型的参数,逐个添加到数组的末尾,并返回数组的长度 改变原数组 arr.po ...
随机推荐
- HDU 4856 (状态压缩DP+TSP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4856 题目大意:有一个迷宫.迷宫里有些隧道,每个隧道有起点和终点,在隧道里不耗时.出隧道就耗时,你的 ...
- javascript为元素绑定事件响应函数
javascript中为元素设置响应时间有两种方法. (1):object.onclick=functionName; 这种方法不可以传递参数. (2):object.onclick=function ...
- AppCache 离线存储 应用程序缓存 API 及注意事项
使用ApplicationCache接口实现离线缓存 原文:http://www.mb5u.com/HTML5/html5_96464.html 推荐:html5 application cache遇 ...
- Toll-Free Bridge
引 在深入了解桥接机制的时候看到一篇好文,虽然已经很久远,但是忍不住看了好几遍,心中诸多不解一扫而光.在此放上链接: 原文:http://ridiculousfish.com/blog/posts/b ...
- Medical Image Processing Conference and Journal 医学图像处理会议与期刊
会议: Information Processing in Medical Imaging,IPMI IPMI2013 International Conference on Medical Imag ...
- Javascript 统计复选框选中个数
var checked = document.getElementsByName("checked_c[]"); var checked_counts = 0; for(var i ...
- 如何查询MySql日志
如何查询MySql日志 分类: mysql2012-02-23 19:14 26756人阅读 评论(2) 收藏 举报 mysqlcommandprintingserversocketoutput 今天 ...
- JLINK SWD下载模式引脚
SWD接4个脚就可以 RESET可以不用接
- P2296 寻找道路
#include <bits/stdc++.h> using namespace std; const int maxn = 10005; set<int> to[maxn]; ...
- java面试问道的
1.java可重入锁 2.Hashmap原理.说说hashMap是怎样实现的(这个之前看过,顺利回答上.还回答了多线程的问题出现的原因,面试官表示很惊讶的样.用hashmap实现hashset 3.