zoukankan      html  css  js  c++  java
  • Javascript Array.prototype.some()

    当我们使用数组时,查找数组中包含某个特殊的项是非常常见的动作。下面例子是一个简单的实现:

    01 planets = [
    02     "mercury",
    03     "venus",
    04     "earth",
    05     "mars",
    06     "jupiter",
    07     "saturn",
    08     "uranus",
    09     "neptune"
    10 ];
    11  
    12 // Default to false
    13 var containsPluto = false;
    14  
    15 for (var i = 0; i < planets.length && !containsPluto; i++) {
    16     if (planets[i] === "pluto") {
    17         containsPluto = true;
    18     }
    19 }
    20  
    21 // Outputs: false
    22 console.log(containsPluto);

    在这个例子中for循环中做了遍历数组元素并进行if条件判断,这个for循环和大多for循环相比有些许复杂,只要找到对应项,循环遍历将会停止。但是我们想如果能传入特定的回调函数来处理此逻辑就更好了,幸运的是Javascript给我们提供了some方法。如果想知道some的使用细节和兼容性情况,请戳这里.
    some方法适应于所有数组,下面我们来看一例子,使用some方法,解决上面例子的问题:

    01 function isPluto(element) {
    02     return (element === "pluto");
    03 }
    04  
    05 // Outputs: false
    06 console.log(planets.some(isPluto));
    07  
    08 dwarfPlanets = [
    09     "ceres",
    10     "pluto",
    11     "haumea",
    12     "makemake",
    13     "eris"
    14 ];
    15  
    16 // Outputs: true
    17 console.log(dwarfPlanets.some(isPluto));

    some 为数组中的每一个元素执行一次 callback 函数,直到找到一个使得 callback 返回一个“真值”(即可转换为布尔值 true 的值)。如果找到了这样一个值,some 将会立即返回 true。否则,some 返回 false。callback 只会在那些”有值“的索引上被调用,不会在那些被删除或从来未被赋值的索引上调用。

    callback 被调用时传入三个参数:元素的值,元素的索引,被遍历的数组。

    如果为 some 提供了一个 thisArg 参数,将会把它传给被调用的 callback,作为 this 值。否则,在非严格模式下将会是全局对象,严格模式下是 undefined。

    some 被调用时不会改变数组。

    some 遍历的元素的范围在第一次调用 callback. 时就已经确定了。在调用 some 后被添加到数组中的值不会被 callback 访问到。如果数组中存在且还未被访问到的元素被 callback 改变了,则其传递给 callback 的值是 some 访问到它那一刻的值。

    除数组元素外,回调函数还可接收两个参数:数组元素当前索引及该数组。这在数组中的某个元素与改元素的其他元素做比较时是非常有用的。看下面这个例子:

    01 function isLessThanPrev(el, index, arr) {
    02     // The first element doesn't have a predecessor,
    03     // so don't evaluate it.
    04     if (index === 0) {
    05         return;
    06     else {
    07         return (el < arr[index - 1]);
    08     }
    09 }
    10  
    11 evens = [2, 4, 6, 8];
    12 randoms = [0, 9, 2, 5];
    13  
    14 // Outputs: false
    15 console.log(evens.some(isLessThanPrev));
    16  
    17 // Outputs: true
    18 console.log(randoms.some(isLessThanPrev));

    但是不幸的是some方法只能在IE9+及现代浏览器中运行,如果想兼容老版本的浏览器,可以使用Underscore库中的some方法或者 compatibility shim 提供的Array#some老版本浏览器兼容方法。

    以上就是对some方法的基本介绍,希望对大家有所帮助,文中不妥支持还望批评斧正。

  • 相关阅读:
    无向图的双连通分量
    以管理员身份运行软件cmd命令
    异或
    递推求解DAG最长路径长度及最长路径条数
    有向图转强连通图最少加边数
    Tarjan强连通分量(scc)
    uni封装request请求
    生命周期
    页面路由,以及传值
    WXS 模块
  • 原文地址:https://www.cnblogs.com/viewcozy/p/4828308.html
Copyright © 2011-2022 走看看