数据结构与算法-数组

创建和初始化数组

由于数组太常见了,一些基本的使用就不说明了

求斐波拉契数列前二十个数字

var fibonacci = []; //{1}
fibonacci[1] = 1; //{2}
fibonacci[2] = 1; //{3}
for (var i = 3; i < 20; i++) {
  fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2]; ////{4}
}
for (var i = 1; i < fibonacci.length; i++) { //{5}
  console.log(fibonacci[i]); //{6}
}

添加和删除元素

var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
// 添加元素
// 尾部添加
numbers[numbers.length] = 10;
numbers.push(11);
numbers.push(12, 13);
// 首部添加
numbers.unshift(-2);
numbers.unshift(-4, -3);
//对应的 你懂得
numbers.pop();
numbers.shift();

// 在数组的任意位置上添加和删除元素
// 使用splice方法,简单地通过指定位置/索引,就可以删除相应位置和数量的元素
numbers.splice(5, 3);
// 把数字2、3、4插入数组里
numbers.splice(5, 0, 2, 3, 4);
// splice方法接收的第一个参数,表示想要删除或插入的元素的索引值。第二个参数是删除 元素的个数(这个例子里,我们的目的不是删除元素,所以传入0)。第三个参数往后,就是要添 加到数组里的值(元素2、3、4)。输出会发现值又变成了从3到12。

二维数组和多维数组

JavaScript只支持一维数组,并不支持矩阵。但是,我们可以像上面的代码一样,用数组套数组,实现矩阵或任一多维数组

function printMatrix(myMatrix) {
  for (var i = 0; i < myMatrix.length; i++) {
    for (var j = 0; j < myMatrix[i].length; j++) {
      console.log(myMatrix[i][j]);
    }
  }
}

以此类推,也可以用这种方式来处理多维数组。假如我们要创建一个3×3的矩阵,每一格里包含矩阵的i(行)、j(列)及z(深度)之和:

var matrix3x3x3 = [];
for (var i = 0; i < 3; i++) {
  matrix3x3x3[i] = [];
  for (var j = 0; j < 3; j++) {
    matrix3x3x3[i][j] = [];
    for (var z = 0; z < 3; z++) {
      matrix3x3x3[i][j][z] = i + j + z;
    }
  }
}

JavaScript数组方法参考

方法 解释
concat 连接2个或更多数组,并返回结果
every 对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true
filter 对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组
forEach 对数组中的每一项运行给定函数。这个方法没有返回值
join 将所有的数组元素连接成一个字符串
indexOf 返回第一个与给定参数相等的数组元素的索引,没有找到则返回-1
lastIndexOf 返回在数组中搜索到的与给定参数相等的元素的索引里最大的值
map 对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组
reverse 颠倒数组中元素的顺序,原先第一个元素现在变成最后一个,同样原先的最后一个元素变成了现在 的第一个
slice 传入索引值,将数组里对应索引范围内的元素作为新数组返回
some 对数组的每一项运行指定函数,如果有真则为真
sort 按照字母顺序对数组进行排序,支持传入指定排序函数作为参数
toString 将数组作为字符串返回
valueOf 和toString类似,将数组作为字符串返回

迭代器函数

JavaScript内置了许多数组可用的迭代方法。对于本节的例子,我们需要数组和函数。假如有 一个数组,它值是从1到15,如果数组里的元素可以被2整除(偶数),函数就返回true,否则返回false

var isEven = function(x) {
  return (x % 2 === 0 ? true : false);
}
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];

numbers.every(isEven); //数组numbers的第一个元素是1,它不是2的倍数(1是奇数),因此isEven 函 数返回false,然后every执行结束。
numbers.some(isEven); //numbers数组中第一个偶数是2(第二个元素)。第一个被迭代的元素是1,isEven会返回false。第二个被迭代的元素是2,isEven返回true——迭代结束。

// 如果要迭代整个数组,可以用forEach方法。它和使用for循环的结果相同:
numbers.forEach(function(x) {
  console.log((x % 2 == 0));
});
var myMap = numbers.map(isEven); //[false, true, false, true, false, true, false, true, false, true, false, true, false, true, false]

var evenNumbers = numbers.filter(isEven); //[2, 4, 6, 8, 10, 12, 14]

numbers.reduce(function(previous, current, index) {
  return previous + current;
}); //120

搜索和排序

首先,我们想反序输出数组numbers(它本来的排序是1, 2, 3, 4,...15)。要实现这样的功能, 可以用reverse方法,然后数组内元素就会反序。

numbers.reverse();

现在,输出numbers的话就会看到[15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]。然后,我们用sort方法:

numbers.sort(function(a, b){
  return a-b;
});

对于一些自定义排序可以这么玩

var friends = [{
    name: 'John',
    age: 30
  },
  {
    name: 'Ana',
    age: 20
  },
  {
    name: 'Chris',
    age: 25
  }
];

function comparePerson(a, b) {
  if (a.age < b.age) {
    return -1
  }
  if (a.age > b.age) {
    return 1
  }
  return 0;
}
console.log(friends.sort(comparePerson));

作者:@lsxlsxxslxsl