js数组也是很重要的一块,所以准备对数组的操作等写一个系列。
1.本部分是二元数组的基础知识。
2.第二部分是数组的几种合并方法优劣比较
http://blog.csdn.net/github_34514750/article/details/51320982
3.第三部分讲解数组简单复制和深度复制
http://blog.csdn.net/github_34514750/article/details/56677750
1.检测数组
value instanceof Array
但若在两个以上不同的全局执行环境下,会存在两个以上版本的Array构造函数,当一个框架向另外一个框架传入数组时,传入的数组和第二个框架中原生创建的数组分别具有不同的构造函数,从而会出错。
Array.isArray(value)
这个是ECMAScript5新增的方法,此方法目的是最终确定某个值是否为数组,不管是在哪个全局执行环境中创建
2. 转换方法
toString(),valueOf(),toLocaleString()
var colors=["red","blue","green"];
alert(colors.toString());
alert(colors.valueOf());
alert(colors);
3. 栈方法
栈是后进先出的数据结构,栈中项的插入和弹出都在栈的顶部。用push()和pop()
push():此方法接收任意数目的参数,将它们逐个添加到数组末尾,返回修改后的数组的长度。
pop():此方法从数组末尾移除最后一项,减少数组的长度,然后返回移除的项。
var colors = new Array();
var count = colors.push("red","green");//count=2
var item = colors.pop();//item=green
4. 队列方法
队列是先进先出。用push()和shift()
shift():此方法从数组对头移除最后一项,减少数组的长度,然后返回移除的项。
因此,unshift()和pop()可以从相反的队列来模拟队列
5.重排序方法(important)
arr.sort([compareFunction])
参数:
compareFunction,可选。用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的诸个字符的Unicode位点进行排序
如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序。记 a 和 b 是两个将要被比较的元素:
var values=[0,1,5,10,15];
alert(values.sort());//0,1,10,15,5是排序结果
sort()排序先调用toString()转型方法,然后比较字符串进行排序,数字排序应该写成
function compare(a,b){
return a-b;//返回升序序列
return b-a;//返回降序序列
}
var values = [0,1,5,10,15];
alert(values.sort(compare));
6.操作方法
concat();复制数组之后,在元素尾部添加元素
方法:
array.concat(value1, value2, …, valueN)
参数:
valueN需要与原数组合并的数组或非数组值.
var num = [1,2,3];
alert(num.concat(4,5));//1,2,3,4,5
如下例子是合并三个数组
var num1 = [1, 2, 3];
var num2 = [4, 5, 6];
var num3 = [7, 8, 9];
// 组成新数组[1, 2, 3, 4, 5, 6, 7, 8, 9]; 原数组 num1, num2, num3 未被修改
var nums = num1.concat(num2, num3);
多个数组和多个非数组值合并为一个新数组:
var alpha = ['a', 'b', 'c'];
// 组成新数组 ["a", "b", "c", 1, 2, 3], 原alpha数组未被修改
var alphaNumeric = alpha.concat(1, [2, 3]);
slice();划分数组
语法:
array.slice([begin[,end]]),提取数组begin到end的元素,但是包含begin不包含end
参数:
一个或者两个参数,就是返回项的起始位置和结束位置
var colors = ["green","yellow","orange","blue"];
alert(colors.slice(1,3));//yellow,orange
splice();可以用来删除,插入,替换数组中的元素
语法:
array.splice(start, deleteCount[, item1[, item2[, …]]])
参数:
start:从数组的哪一位开始修改内容。如果超出了数组的长度,则从数组末尾开始添加内容;如果是负值,则表示从数组末位开始的第几位。
deleteCount:
整数,表示要移除的数组元素的个数。如果 deleteCount 是 0,则不移除元素。这种情况下,至少应添加一个新元素。如果 deleteCount 大于start 之后的元素的总数,则从 start 后面的元素都将被删除(含第 start 位)。
items:
要添加进数组的元素。如果不指定,则 splice() 只删除数组元素。
//splice()可以用于删除数组中的某个元素
for(var i = 0;i < array.length;i++) {
if(content === array[i]) {
//第一个参数是要删除的第一项,第二个参数是要删除的项数
array.splice(i,1);
}
}
//splice()可以用于插入元素到数组中
//参数:1.插入的位置2.删除项数3.插入元素
var colors = ["green","blue"];
colors.splice(1,0,"yellow","orange");
alert(colors);//green,yellow,orange,blue
//splice()可以用于替换元素到数组中
//参数:1.起始位置2.删除项数3.插入元素
var colors = ["green","yellow","orange","blue"];
colors.splice(1,1,"red","purple");
alert(colors);//green,red,purple,orange,blue
7. 位置方法
indexOf();
语法:
arr.indexOf(searchElement[, fromIndex = 0])
参数:
searchElement
要查找的元素
fromIndex
开始查找的位置。如果该索引值大于或等于数组长度,意味着不会在数组里查找,返回-1。如果参数中提供的索引值是一个负值,则将其作为数组末尾的一个抵消,即-1表示从最后一个元素开始查找,-2表示从倒数第二个元素开始查找 ,以此类推。 注意:如果参数中提供的索引值是一个负值,仍然从前向后查询数组。如果抵消后的索引值仍小于0,则整个数组都将会被查询。其默认值为0.
var array = [2, 5, 9];
array.indexOf(2); // 0
array.indexOf(7); // -1
array.indexOf(9, 2); // 2
array.indexOf(2, -1); // -1
array.indexOf(2, -3); // 0
lastIndexOf();
二者都返回查找的项在数组中的位置;
接收参数:1. 要查找的项 2. 查找起点位置的索引(可选)
8. 迭代方法
语法:
arr.every(callback[, thisArg])
ps:其他几个类似
参数:
1.callback要在每一项上运行的函数
2.运行该函数的作用域对象(可选)
callback 被调用时传入的参数
1.数组项的值
2.该项在数组中的位置
3.数组对象本身
every():
对数组中的每一项运行给定函数,若该函数对每一项都返回true,则返回true,若有一个返回false,则不执行接下来的回调,立即返回false
var isNum = function(item,index,array) {
return (item>2);
}
var res = arr.every(isNum);
console.log(res);//false;
或者
var res = arr.every(function(item,index,array){
return (item>2);
});
console.log(res);//false;
some():
对数组中的每一项运行给定函数,若该函数对某一项返回true,则立即返回true,不执行接下来的回调。
forEach():
对数组中的每一项运行给定函数,这个方法没有返回值
function logArrayElements(element, index, array) {
console.log("a[" + index + "] = " + element);
}
[2, 5, 9].forEach(logArrayElements);
// logs:
// a[0] = 2
// a[1] = 5
// a[2] = 9
filter():
对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组,被删除或从来未被赋值的元素不会被遍历到。
function isBigEnough(element) {
return element >= 10;
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
// filtered is [12, 130, 44]
map():
对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组
var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
/* roots的值为[1, 2, 3], numbers的值仍为[1, 4, 9] */
9. 归并方法
EMCAScript5新添了reduce()和reduceRight()两个方法都迭代数组中所有的项,然后构建一个最终返回的值。
reduce(): 从第一项遍历到最后
reduceRight()按降序索引顺序处理元素。
语法
array1.reduce(callbackfn[, initialValue])
参数:
callbackfn:回调函数
(传入这些方法中的函数会接收四个参数:previousValue,currentValue
,currentIndex和array)
通过上一次调用回调函数获得的值。如果向 reduce 方法提供 initialValue,则在首次调用函数时,previousValue 为 initialValue。
initialValue
作为归并基础的初始值(可选)
如果指定 initialValue,则它将用作初始值来启动累积。第一次调用 callbackfn 函数会将此值作为参数而非数组值提供。
返回值
通过最后一次调用回调函数获得的累积结果。
function addDigitValue(previousValue, currentDigit, currentIndex, array) {
var exponent = (array.length - 1) - currentIndex;
var digitValue = currentDigit * Math.pow(10, exponent);
return previousValue + digitValue;
}
var digits = [4, 1, 2, 5];
// Determine an integer that is computed from values in the array.
var result = digits.reduce(addDigitValue, 0);
document.write (result);
// Output: 4125
10.二元数组的创建
var data = [];
for(var i = 0;i < len;i++){
//二元数组
data[i] = [];
//二元数组赋值方法1
data[i][0] = arr[i].firstChild.substringData(0,2);
data[i][1] = arr[i].lastChild.innerHTML;
//二元数组赋值方法2
data[i].push(arr[i].firstChild.substringData(0,2));
data[i].push(arr[i].lastChild.innerHTML);
}