数组
特点:
ECMAScript中的数组每个元素可以保存任何类型。
ECMAScript中数组的大小也是可以自动调整的。
Array类型
定义:数组在Javascript中是一种引用类型,通常叫做数组(Array)对象。
创建Array类型有两种方式:第一种是new运算符,第二种是字面量。数组.note
使用new关键字创建数组
var box = new Array(); //创建了一个数组
var box = new Array(10); //创建一个包含10个元素的数组
var box = new Array('东方睿智',28,'教师','盐城'); //创建一个数组并分配好了元素
使用字面量方式创建数组
var box = []; //创建一个空的数组
var box = ['东方睿智',28,'教师','盐城']; //创建包含元素的数组
var box = [1,2,]; //禁止这么做,IE会识别3个元素
var box = [,,,,,]; //同样,IE的会有识别问题
使用索引下标来读取数组的值
下标索引是从0开始的;
alert(box[2]); //获取第三个元素
box[2] = '学生'; //修改第三个元素
box[4] = '计算机编程'; //增加第五个元素
使用length属性获取数组元素量
alert(box.length) //获取元素个数
box.length = 10; //强制元素个数
box[box.length] = 'JS技术'; //通过length给数组增加一个元素
创建一个复杂一点的数组
提示:Js中的数组可以存放任意数据的类型的数据
var box = [
{ //第一个元素是一个对象
name : '东方睿智',
age : 28,
run : function () {
return 'run了';
}
},
['马云','李彦宏',new Object()],//第二个元素是数组
'江苏', //第三个元素是字符串
25+25, //第四个元素是数值
new Array(1,2,3) //第五个元素是数组
];
案例:1-100之间能被3整数的数字,存到数组中
//小技巧:数组的长度刚好可以作为数组中下一个元素的索引值。
var arr2 = [];
for (var i = 1; i <= 100; i++) {
if (i % 3 == 0) {
arr2[arr2.length] = i;
}
}
console.log(arr2);
案例:求一组数中的所有数的和和平均值
var arr = [10, 20, 30];
//计数器思想
var sum = 0;
for (var i = 0; i < arr.length; i++) {
sum += arr[i];
}
console.log(sum);
var avg = sum / arr.length;
console.log(avg);
案例:求一组数中的最大值和最小值,以及所在位置
//预热案例:求最大值
var arr = [-10, 20, -30, 0];
//必须使用数组中的值。(最好是第一个或者最后一个,可以少比较一次)
// var max = 0;
var max = arr[0];
var min = arr[0];
for (var i = 1; i < arr.length; i++) {
//遍历数组,判断数组中的每一项,如果比max大,赋值给max,否则不用管
if (arr[i] > max) {
max = arr[i];
}
}
console.log(max);
//console.log("最小值:" + min);
数组中的方法
Array中的方法
方法 描述
concat() 连接两个或更多的数组,并返回结果。
join() 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。
pop() 删除并返回数组的最后一个元素
push() 向数组的末尾添加一个或更多元素,并返回新的长度。
reverse() 颠倒数组中元素的顺序。
shift() 删除并返回数组的第一个元素
slice() 从某个已有的数组返回选定的元素
sort() 对数组的元素进行排序
splice() 删除元素,并向数组添加新元素。
toString() 把数组转换为字符串,并返回结果。
unshift() 向数组的开头添加一个或更多元素,并返回新的长度。
转换方法
对象或数组都具有toLocaleString()、toString()和valueOf()方法。其中toString()和valueOf()无论重写了谁,都会返回相同的值。数组会讲每个值进行字符串形式的拼接,以逗号隔开。
var box = ['东方睿智',28,'计算机编程']; //字面量数组
alert(box); //隐式调用了toString()
alert(box.toString()); //和valueOf()返回一致
alert(box.toLocaleString()); //返回值和上面两种一致
默认情况下,数组字符串都会以逗号隔开。如果使用join()方法,则可以使用不同的分隔符来构建这个字符串。
var box = [‘东方睿智’, 28, ‘计算机编程’];
alert(box.join(’|’)); //东方睿智|28|计算机编程
HTML模板拼接案例:
方法:js字符串拼接
push()
定义:push()方法可以接收任意数量的参数,把它们逐个添加到数组的末尾,并返回修改后数组的长度。
语法: arrObj.push(……);
pop()
定义:pop() 方法将删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值。如果数组已经为空,则 pop() 不改变数组,并返回 undefined 值。
语法:arrObj.pop()
var box = ['我在', 28, '计算机编程']; //字面量声明
alert(box.push('盐城')); //数组末尾添加一个元素,并且返回长度
alert(box); //查看数组
box.pop(); //移除数组末尾元素,并返回移除的元素
alert(box); //查看元素
Array.shift()
shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值;
语法:arrayObject.shift();
返回值:数组原来的第一个元素的值;
代码:
var box = ['我在', 28, '计算机编程'];//字面量声明
alert(box.push('盐城')); //数组末尾添加一个元素,并且返回长度
alert(box); //查看数组
alert(box.shift()); //移除数组开头元素,并返回移除的元素
alert(box); //查看数组
Array.unshift()
定义:和shift()方法的功能完全相反。unshift()方法为数组的前端添加一个元素。
返回值:返回添加后数组的长度。
var box = ['我在, 28, '计算机编程']; //字面量声明
alert(box.unshift('盐城','江苏')); //数组开头添加两个元素
alert(box); //查看数组
alert(box.pop()); //移除数组末尾元素,并返回移除的元素
alert(box); //查看数组
注解:IE浏览器对unshift()方法总是返回undefined而不是数组的新长度。
重排序方法:reverse()和 sort()方法
reverse() 逆向排序
var box = [1,2,3,4,5]; //数组
alert(box.reverse()); //逆向排序方法,返回排序后的数组
alert(box); //源数组也被逆向排序了,说明是引用
注意:会改变原数组的值
sort() 从小到大排序
var box = [4,1,7,3,9,2]; //数组
alert(box.sort()); //从小到大排序,返回排序后的数组
alert(box); //源数组也被从小到大排序了
注意:会改变原数组的值
function compare(value1, value2) { //数字排序的函数参数
if (value1 < value2) { //小于,返回负数
return -1;
} else if (value1 > value2) { //大于,返回正数
return 1;
} else { //其他,返回0
return 0;
}
}
var box = [0,1,5,10,15]; //验证数字字符串,和数字的区别
alert(box.sort(compare)); //传参
注解:如果要反向操作,即从大到小排序,正负颠倒即可。当然,如果要逆序用reverse()更加方便。
常用的操作方法
Array.concat()
定义:concat()方法可以基于当前数组创建一个新数组。
语法:arrayObj.concat( 元素|数组);
Array. slice(start,param2)
定义:slice(start,param2)方法可以基于当前数组获取指定区域元素并创建一个新数组。
语法:arrayObject.slice(start,end)
start:
必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
end
可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。
Array. Splice()
定义:主要用途是向数组的中部插入元素。
语法:
arrayObject.splice(index,howmany,item1,…,itemN)
index:必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany:必需。要删除的项目数量。如果设置为 0,则不会删除项目。
item1,…itemN:可选。向数组添加的新项目。
返回值:数组(被删除的元素);
执行删除功能:
执行插入功能:
执行替换功能:
let 和 const 命令
http://es6.ruanyifeng.com/#docs/let#const-命令
基本用法let
ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
小案例:冒泡排序
//步骤:
//1.双重for循环。
//2.指定轮数和次数
//3.判断是否符合标准。如果符合标准交换位置。
//1.双重for循环。(外循环控制轮数)
var arr = [7, 6, 5, 4, 3, 2, 1];
for (var i = 0; i < arr.length - 1; i++) {
//2.指定轮数和次数(内循环控制次数)
for (var j = 0; j < arr.length - 1; j++) {
//3.判断是否符合标准。如果符合标准交换位置。
//从小到大排列顺滑,如果前面的比后面的大,那么交换位置。
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
console.log(arr);
案例:冒泡的升级版
优化版冒泡排序!
var arr = [1, 22,3, 4, 5, 6, 7];
//var arr = [7, 6, 5, 4, 3, 2, 1];
console.log(arr);
//如果比较完备提前结束比较。(判断,如果本次比较没有移动任何元素,那么说明已经比较完成)
var m = 0;
var n = 0;
//1.双重for循环。(外循环控制轮数)
for (var i = 0; i < arr.length - 1; i++) {
//开闭原则。(写在第一个for循环里,是为了,每轮比较初始化bool变量变为true。)
var bool = true;
console.log(111);
//2.指定轮数和次数(内循环控制次数)
for (var j = 0; j < arr.length - 1 - i; j++) {
//3.判断是否符合标准。如果符合标准交换位置。
//从小到大排列顺滑,如果前面的比后面的大,那么交换位置。
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
bool = false;
}
m++;
}
n++;
//bool这个变量默认值为true;如果本轮比较有一对元素相互交换位置,那么也不能跳出循环。
//但是,如果本轮比较没有任何元素相互交换位置,那么说明已经比较完成,可以跳出循环。
if (bool) {
break;
}
}
console.log(arr);
console.log(m);
console.log(n);
数组去重
方法一:
var arra = [1, 2, 3, 4, 4, 1, 1, 2, 1, 1, 1];
Array.prototype.distinct = function () {
var arr = this,
result = [],
i, j, len = arr.length;
for (i = 0; i < len; i++) {
for (j = i +1; j < len; j++) {
if (arr[i] === arr[j]) {
j = + +i;
}
}
result.push(arr[i]);
}
return result;
}
var arra = [1, 2, 3, 4, 4, 1, 1, 2, 1, 1, 1];
arra.distinct(); //返回[3,4,2,1]
方法二:
双层循环,外层循环元素,内层循环时比较值
值相同时,则删去这个值
注意点:删除元素之后,需要将数组的长度也减1.
Array.prototype.distinct = function () {
var arr = this,
i,
j,
len = arr.length;
for (i = 0; i < len; i++) {
for (j = i + 1; j < len; j++) {
if (arr[i] == arr[j]) {
arr.splice(j, 1);
len--;
j--;
}
}
}
return arr;
};
var a = [1, 2, 3, 4, 5, 6, 5, 3, 2, 4, 56, 4, 1, 2, 1, 1, 1, 1, 1, 1, ];
var b = a.distinct();
console.log(b.toString()); //1,2,3,4,5,6,56
优点:简单易懂
缺点:占用内存高,速度慢