JavaScript数据结构与算法Item1--数组

几乎所有的编程语言都原生支持数组类型,因为数组是最简单的内存数据结构。JavaScript
里也有数组类型,数组存储一系列同一种数据类型的值。但在JavaScript里,也可以在数组中保存不同类型的值。

数组遍历

1 数组合并

考虑如下场景:有多个数组,需要合并起来成为一个数组。我们可以迭代各个数组,然后把
每个元素加入最终的数组。幸运的是,JavaScript已经给我们提供了解决方法,叫作concat方法:

var zero = 0;
var positiveNumbers = [1,2,3];
var negativeNumbers = [-3,-2,-1];
var numbers = negativeNumbers.concat(zero, positiveNumbers);

2 迭代器函数

有时我们需要迭代数组中的元素。前面我们已经学过,可以用循环语句来处理,例如for语句。
JavaScript内置了许多数组可用的迭代方法。

1.arr.every(function(){})方法

every方法会迭代数组中的每个元素,直到返回false

function isEven(x){
    return (x%0 == 0) ? true: false;
  }

  var arr =[1,2,3,4,5,6,7,8,9,10];
  var result = arr.every(isEven);

  console.log(result);//false

在这个例子里,数组numbers的第一个元素是1,它不是2的倍数(1是奇数), 因此isEven 函
数返回false,然后every执行结束。

2.arr.some(function(){})方法

来看some方法。它和every的行为类似,不过some方法会迭代数组的每个元
素,直到函数返回true:

var result2 = arr.some(isEven);
  console.log(result2);//true

在我们的例子里,arr数组中第一个偶数是2(第二个元素)。第一个被迭代的元素是1,
isEven会返回false。第二个被迭代的元素是2,isEven返回true——迭代结束。

3.arr.forEach(function(item){})方法

如果要迭代整个数组,可以用forEach方法。它和使用for循环的结果相同:

numbers.forEach(function(x){
    console.log((x % 2 == 0));
});

4.arr.map(function(){})方法

JavaScript还有两个会返回新数组的遍历方法。第一个是map:

var myMap = arr.map(isEven);

数组myMap里的值是:[false, true, false, true, false, true, false, true, false]。它保存了传入map方法的isEven函
数的运行结果。这样就很容易知道一个元素是否是偶数。比如,myMap[0]是false,因为1不是
偶数;而myMap[1]是true,因为2是偶数。

5.arr.filter(function(){})方法

还有一个filter方法。它返回的新数组由使函数返回true的元素组成:

console.log(arr.filter(function(x){
    return (x%2==0);
  })); //[2, 4, 6, 8, 10]

6.arr.reduce(function(pre,curr,index, arr){})

reduce方法。reduce方法接收一个函数作为参数,这个函数有四个参数:
previousValue、currentValue、index和array。这个函数会返回一个将被叠加到累加器的
值,reduce方法停止执行后会返回这个累加器。如果要对一个数组中的所有元素求和,这就很
有用,比如:

arr.reduce(function(previous, current, index){
    return previous + current;
});

输出将会是55。

7.arr.join()–数组转化为字符串

var numbersString = numbers.join('-');
console.log(numbersString);

这将输出:
1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-10

搜索和排序

1.arr.reverse();

数组内元素就会反序

2.sort([function(){}])方法

  var numbers =[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
  console.log(numbers.sort());

然而,如果输出数组,结果会是[1, 10, 11, 12, 13, 14, 15, 2, 3, 4, 5, 6, 7, 8,
9]。看起来不大对,是吧?这是因为sort方法在对数组做排序时,把元素默认成字符串进行相
互比较。
我们可以传入自己写的比较函数,因为数组里都是数字,所以可以这样写:

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

这段代码,对于b大于a时,会返回负数,反之则返回正数。如果相等的话,就会返回0。也
就是说返回的是负数,就说明a比b小,这样sort就根据返回值的情况给数组做排序。

function compare(a, b) {
    if (a < b) {
        return -1;
    }
    if (a > b) {
        return 1;
    }
    // a必须等于
    return 0;
}
numbers.sort(compare);

自定义排序

我们可以对任何对象类型的数组排序,也可以创建compareFunction来比较元素。例如,
对象Person有名字和年龄属性,我们希望根据年龄排序,就可以这么写:

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));// 按照age从小到大排序;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值