1.创建数组

var numbers = [];
var numbers = new Array();
//在调用 Array 的构造函数时,可以只传入一个参数,用来指定数组的长度
var numbers = new Array(10)
console.log(numbers.length)// 显示 10
可以调用 Array.isArray() 来判断一个对象是否是数组

2.由字符串生成数组

1字符串对象的 split() 方法也可以生成数组

var sentence = "the quick brown fox jumped over the lazy dog";
var words = sentence.split(" ");
for (var i = 0; i < words.length; ++i) {
    print("word " + i + ": " + words[i]);
}
//该程序的输出为:
word 0: the
word 1: quick
word 2: brown
word 3: fox
word 4: jumped
word 5: over
word 6: the
word 7: lazy
word 8: dog

(1)浅复制,新数组依然指向原来的数组(当把一个数组赋给另外一个数组时,只是为被赋值的数组增加了一个新的引用。当你通过原引用修改了数组的值,另外一个引用也会感知到这个变化)

var nums = [];
for (var i = 0; i < 100; i++) {
    nums[i] = i+1;
}
var samenums = nums;
nums[0] = 400;
print(samenums[0]); // 显示 400

(2)深复制,将原数组中的每一个元素都复制一份到新数组中。

function copy(arr1, arr2) {
    for (var i = 0; i < arr1.length; i++) {
        arr2[i] = arr1[i];
    }
}
var nums = [];
for (var i = 0; i < 100; i++) {
    nums[i] = i+1;
}
var samenums = [];
copy(nums, samenums);
nums[0] = 400;
print(samenums[0]); // 显示 1

3.存取函数

JavaScript 提供了一组用来访问数组元素的函数,叫做存取函数,这些函数返回目标数组
的某种变体
  1. 查找元素

    (1)indexOf(),用来查找传进来的参数在目标数组中是否存在,如果目标数组包含该参数,就返回该元素在数组中的索引;如果不包含,就返回 -1。如果数组中包含多个相同的元素,indexOf() 函数总是返回第一个与参数相同的元素的索引。
    (2)lastIndexOf(),该函数返回相同元素中最后一个元素的索引,如果没找到相同元素,则返回 -1

  2. 数组的字符串表示
    将数组转化为字符串:join() 和 toString(),这两个方法都返回一个包含数组所有元素的字符串,各元素之间用逗号分隔开
  3. 由已有数组创建新数组
    concat() 和 splice() 方法允许通过已有数组创建新数组。concat 方法可以合并多个数组
    创建一个新数组,splice() 方法截取一个数组的子集创建一个新数组。
var names = ["David", "Cynthia", "Raymond", "Clayton", "Mike", "Jennifer"];
var namestr = names.join();
print(namestr); // David,Cynthia,Raymond,Clayton,Mike,Jennifer
namestr = names.toString();
print(namestr); // David,Cynthia,Raymond,Clayton,Mike,Jennifer

4.为数组添加元素

push() 方法会将一个元素添加到数组末尾
unshift() 方法可以将元素添加在数组的开头

5.从数组中删除元素

使用 pop() 方法可以删除数组末尾的元素
shift() 方法可以删除数组的第一个元素
使用 splice() 方法为数组添加元素,需提供如下参数:
• 起始索引(也就是你希望开始添加元素的地方);
• 需要删除的元素个数(添加元素时该参数设为 0);
• 想要添加进数组的元素。

6.为数组排序

reverse(),该方法将数组中元素的顺序进行翻转
sort() 方法是按照字典顺序对元素进行排序的,因此它假定元素都是字符串类型

var names = ["David","Mike","Cynthia","Clayton","Bryan","Raymond"];
names.sort();// Bryan,Clayton,Cynthia,David,Mike,Raymond
names.sort().reverse()//Raymond,Mike,David,Cynthia,Bryan

对于数字类型,该函数可以是一个简单的相减操作,从一个数字中减去另外一个数字。如
果结果为负,那么被减数小于减数;如果结果为 0,那么被减数与减数相等;如果结果为
正,那么被减数大于减数。
将这些搞清楚之后,传入一个大小比较函数,再来看看前面的例子:
function compare(num1, num2) {
return num1 - num2;
}
var nums = [3,1,2,100,4,200];
nums.sort(compare);
console.log(nums); // 1,2,3,4,100,200
sort() 函数使用了 compare() 函数对数组按照数字大小进行排序,而不是按照字典顺序。

7.迭代器方法

  1. 不生成新数组的迭代器方法
    是 forEach(),该方法接受一个函数作为参数,对数组中的每个元素使用该函数。

     function square(num) {
        console.log(num, num * num);
       }
      var nums = [1,2,3,4,5,6,7,8,9,10];
      nums.forEach(square);
      //该程序的输出为:
        1 1
        2 4
        3 9
        4 16
        5 25
        6 36
        7 49
        8 64
        9 81
        10 100
    every(),该方法接受一个返回值为布尔类型的函数,对数组中的每个元素使用该函数。如果对于所有的元素,该函数均返回 true,则该方法返回 true。
    
请输入代码
 function isEven(num) {
    return num % 2 == 0;
    }
    var nums = [2,4,6,8,10];
    var even = nums.every(isEven);
    if (even) {
        console.log("all numbers are even");
    }
    else {
         console.log("not all numbers are even");
    }
    //输出为:
    all numbers are even
some() 方法也接受一个返回值为布尔类型的函数,只要有一个元素使得该函数返回 true,
该方法就返回 true。
function isEven(num) {
return num % 2 == 0;
}
var nums = [1,2,3,4,5,6,7,8,9,10];
var someEven = nums.some(isEven);
if (someEven) {
print("some numbers are even");
}
else {
print("no numbers are even");
}
nums = [1,3,5,7,9];
someEven = nums.some(isEven);
if (someEven) {
print("some numbers are even");
}
else {
print("no numbers are even");
}
//该程序的输出为:
some numbers are even
no numbers are even

reduce() 方法接受一个函数,返回一个值。该方法会从一个累加值开始,不断对累加值和数组中的后续元素调用该函数,直到数组中的最后一个元素,最后返回得到的累加值。

 function add(runningTotal, currentValue) {
    return runningTotal + currentValue;
}
var nums = [1,2,3,4,5,6,7,8,9,10];
var sum = nums.reduce(add);
console.log(sum); // 显示 55
  1. 生成新数组的迭代器方法
    map() 和 filter()
    map() 返回一个新的数组,该数组的元素是对原有元素应用某个函数得到的结果
function curve(grade) {
return grade += 5;
}
var grades = [77, 65, 81, 92, 83];
var newgrades = grades.map(curve);
consoe.log(newgrades); // 82, 70, 86, 97, 88

对一个字符串数组使用 map() 方法的例子:

function first(word) {
    return word[0];
}
var words = ["for","your","information"];
var acronym = words.map(first);
print(acronym.join("")); // 显示 "fyi"

filter(),传入一个返回值为布尔类型的函数,当对数组中的所有元素应用该函数,结果均为 true 时,该方法并不返回 true,而是返回一个新数组,该数组包含应用该函数后结果为 true 的元素。

function isEven(num) {
    return num % 2 == 0;
}
function isOdd(num) {
    return num % 2 != 0;
}
var nums = [];
for (var i = 0; i < 20; ++i) {
    nums[i] = i+1;
}
var evens = nums.filter(isEven);
console.log("Even numbers: ");
console.log(evens);
var odds = nums.filter(isOdd);
console.log("Odd numbers: ");
console.log(odds);
//该程序的执行结果如下:
Even numbers:
2,4,6,8,10,12,14,16,18,20
Odd numbers:
1,3,5,7,9,11,13,15,17,19

还可以使用 filter() 方法过滤字符串数组,下面这个例子过滤掉了那些不包含
“cie”的单词

function afterc(str) {
if (str.indexOf("cie") > -1) {
return true;
}
return false;
}
var words = ["recieve","deceive","percieve","deceit","concieve"];
var misspelled = words.filter(afterc);
console.log(misspelled); // 显示 recieve,percieve,concieve

二维和多维数组

1.创建二维数组

Array.matrix = function(numrows, numcols, initial) {
var arr = [];
for (var i = 0; i < numrows; ++i) {
var columns = [];
for (var j = 0; j < numcols; ++j) {
columns[j] = initial;
}
arr[i] = columns;
}
return arr;
}

2.处理二维数组的元素

处理二维数组中的元素,有两种最基本的方式:按列访问和按行访问

//得到该学生的平均成绩
var grades = [[89, 77, 78],[76, 82, 81],[91, 94, 89]];
var total = 0;
var average = 0.0;
for (var row = 0; row < grades.length; ++row) {
    for (var col = 0; col < grades[row].length; ++col) {
        total += grades[row][col];
    }
    average = total / grades[row].length;
    console.log("Student " + parseInt(row+1) + " average: " + average.toFixed(2));
    total = 0;
    average = 0.0;
}
//以下为程序的输出:
Student 1 average: 81.33
Student 2 average: 79.67
Student 3 average: 91.33
//一个学生各科的平均成绩
var grades = [[89, 77, 78],[76, 82, 81],[91, 94, 89]];
var total = 0;
var average = 0.0;
for (var col = 0; col < grades.length; ++col) {
for (var row = 0; row < grades[col].length; ++row) {
total += grades[row][col];
}
average = total / grades[col].length;
print("Test " + parseInt(col+1) + " average: " +average.toFixed(2));
total = 0;
average = 0.0;
}
//该程序的输出为:
Test 1 average: 85.33
Test 2 average: 84.33
Test 3 average: 82.67

3.参差不齐的数组

//为了给个示例,假设数组 grades 中,每个学生成绩记录的个数是不一样的,不用修改代码,依然可以正确计算出正确的平均分:
var grades = [[89, 77],[76, 82, 81],[91, 94, 89, 99]];
var total = 0;
var average = 0.0;
for (var row = 0; row < grades.length; ++row) {
for (var col = 0; col < grades[row].length; ++col) {
total += grades[row][col];
}
average = total / grades[row].length;
print("Student " + parseInt(row+1) + " average: " + average.toFixed(2));
total = 0;
average = 0.0;
}
//注意第一名同学只有两门课的成绩,而第二名同学有三门课的成绩,第三名同学有四门课的成绩。因为程序在内层的 for 循环中计算了每个数组的长度,即使数组中每一行的长度不一,程序依然不会出什么问题。该段程序的输出为:
Student 1 average: 83.00
Student 2 average: 79.67
Student 3 average: 93.25

对象数组

function Point(x,y) {
this.x = x;
this.y = y;
}
function displayPts(arr) {
for (var i = 0; i < arr.length; ++i) {
print(arr[i].x + ", " + arr[i].y);
}
}
var p1 = new Point(1,2);
var p2 = new Point(3,5);
var p3 = new Point(2,8);
var p4 = new Point(4,4);
var points = [p1,p2,p3,p4];
for (var i = 0; i < points.length; ++i) {
print("Point " + parseInt(i+1) + ": " + points[i].x + ", " + points[i].y);
}
var p5 = new Point(12,-3);
points.push(p5);
print("After push: ");
displayPts(points);
points.shift();
print("After shift: ");
displayPts(points)

对象中的数组

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 < this.dataStore.length; ++i) {
total += this.dataStore[i];
}
return total / this.dataStore.length;
}
var thisWeek = new weekTemps();
thisWeek.add(52);
thisWeek.add(55);
thisWeek.add(61);
thisWeek.add(65);
thisWeek.add(55);
thisWeek.add(50);
thisWeek.add(52);
thisWeek.add(49);
print(thisWeek.average()); // 显示 54.875

冰格儿
143 声望12 粉丝