澄清filter()函数;怎么运行的

时间:2019-04-11 09:50:10

标签: javascript

因此,我正在自学HTML,CSS,JavaScript。我正在浏览箭头函数,并在MDN网站上找到了以下代码,但不确定我是否清楚了解filter()函数的工作方式。这就是我的理解:“ word”是testFunct()的参数,参数是wrds数组的元素,它们被传递给testFunct(word)。就像过滤器功能遍历数组的每个元素(参数)并评估需求(word.length> 6)一样吗?就像使用normal(对我来说是个新手,这对我来说是正常的)参数/参数对一样,假设您传递了2个参数,并且有2个参数可以接收它们。谢谢。

var wrds = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];

//const result = words.filter(word => word.length > 6);

//write the arrow function as full function to see if you understood how it works. 

const result = wrds.filter(function testFunct(word) {return word.length > 6;});

console.log(result); 



 prints 'exuberant', 'destruction', 'present

3 个答案:

答案 0 :(得分:1)

在同一MDN页面上的polyfill表示该算法与ECMA-262第5版中指定的算法完全相同

if (!Array.prototype.filter){
  Array.prototype.filter = function(func, thisArg) {
    'use strict';
    if ( ! ((typeof func === 'Function' || typeof func === 'function') && this) )
        throw new TypeError();

    var len = this.length >>> 0,
        res = new Array(len), // preallocate array
        t = this, c = 0, i = -1;
    if (thisArg === undefined){
      while (++i !== len){
        // checks to see if the key was set
        if (i in this){
          if (func(t[i], i, t)){
            res[c++] = t[i];
          }
        }
      }
    }
    else{
      while (++i !== len){
        // checks to see if the key was set
        if (i in this){
          if (func.call(thisArg, t[i], i, t)){
            res[c++] = t[i];
          }
        }
      }
    }

    res.length = c; // shrink down array to proper size
    return res;
  };
}

因此,是的,它使用while循环来迭代数组。

答案 1 :(得分:0)

  

就像过滤函数遍历数组的每个元素(参数)并评估需求(word.length> 6)一样吗?

是的。 (对于“ assessess”值等于“以数组元素作为参数调用该函数并测试响应的真实性。)

  假设您传递2个参数,并且有2个参数可以接收它们。

您传递的唯一参数是函数filter()的参数。

调用该函数的是filter(),它传递三个参数(当前数组元素,该元素的索引以及整个数组)。

答案 2 :(得分:0)

函数过滤器就像一个for循环,它获取数组的每个元素并使用函数对其进行过滤。假设:

var words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];

const result = words.filter(word => word.length > 6);

先进行“喷涂”,然后进行限制,再进行精英赛等,然后进行

spray.length > 6 = false 
limit.length > 6 = false 
elite.length > 6 = false 
exuberant.length > 6 = true
destruction.length > 6 = true
present.length > 6 = true

获取所有true并将其重新映射到新数组中