Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解数组find()旁边的Javascript速记箭头语法_Javascript_Ecmascript 6_Arrow Functions - Fatal编程技术网

了解数组find()旁边的Javascript速记箭头语法

了解数组find()旁边的Javascript速记箭头语法,javascript,ecmascript-6,arrow-functions,Javascript,Ecmascript 6,Arrow Functions,如果可以的话,我只是想了解这个函数中到底发生了什么,这样我就可以更好地根据我的用例进行调整,并在需要时编写更简洁/更短的代码。这个函数当然可以工作,我也可以使用它,但是当我不能完全理解我正在使用的代码时,它会让我感到厌烦。我想我大部分都能理解,但我很难把所有的部分都整合起来。如果这是一个重复,那么所有的道歉,请标记为这样,但我无法找到一个确切的答案,我试图理解。从其他回答的问题和外部文章中,我已经能够理解大部分正在发生的事情,但我仍然在几点上陷入困境 确切的代码是: const userBy =

如果可以的话,我只是想了解这个函数中到底发生了什么,这样我就可以更好地根据我的用例进行调整,并在需要时编写更简洁/更短的代码。这个函数当然可以工作,我也可以使用它,但是当我不能完全理解我正在使用的代码时,它会让我感到厌烦。我想我大部分都能理解,但我很难把所有的部分都整合起来。如果这是一个重复,那么所有的道歉,请标记为这样,但我无法找到一个确切的答案,我试图理解。从其他回答的问题和外部文章中,我已经能够理解大部分正在发生的事情,但我仍然在几点上陷入困境

确切的代码是:

const userBy = id => u => u.id == id; 
const users = [{ id: 1, name: "Kaio" }, { id: 2, name: "Gabriella" }, { id: 3, name: "Enzo" }];
const id = 2;
const user = users.find(userBy(id));
我的主要问题是:

const userBy = id => u => u.id == id;
我从这篇文章中得到了代码,以防需要更多的上下文,尽管前面提到的代码应该足够了-

我知道在“userBy”函数中,“id”作为参数传入。我还了解到,在速记语法中,return语句是隐含的,find()方法有自己的三个参数(元素、索引、数组),很像我理解和经常使用的forEach()函数

总而言之,我知道“id”是作为参数传入的,但如果我理解正确,“u”将作为最终函数的参数返回和/或传入,其中指定的属性“id”为“u”,等于传入原始函数的参数“id”。因为我知道find()方法在一个数组上迭代,所以我可以合理地推断'u'是该数组的当前元素/索引

我很难理解的具体部分是“u”是如何捕获元素/索引作为其值的。还有为什么“u”需要在它自己的函数中,而不是作为启动函数的“id”参数旁边的另一个参数

就像我说的,这个函数可以工作,不管我是否理解它,一切都很好。但如果有人能抽出时间向我解释到底发生了什么,我将不胜感激。我已经研究并理解了我自己所能做的一切,只需要一只手抓住我提到的最后几点


[帖子回复编辑]它要求我解释为什么这个问题不同于。它们非常相似,但我认为在我的具体情况下,添加了Array.prototype.find方法,这足以证明它有自己的解释。在它的核心,虽然我可以看到一些人可能会把它贴上相同的标签,所以如果其他人有这种感觉,那么无论如何都要把它标记为一个副本。无论什么对社区最好,我都很满意,我只是感谢社区花时间帮助我理解我的问题。

首先,让我们看看。find正在做什么。.find的实现如下所示:

Array.prototype.find = function (callback) {
  for (let i = 0; i < this.length; i++) {
    const match = callback(this[i], i, this);
    if (match) {
      return this[i];
    }
  }
}
const user = users.find(userBy(2));
或更短:

users.find(user => user.id === 2);

现在,您展示的代码更进一步。它预见到了希望找到
user.id==2
,但也希望找到
user.id==1
,以及
user.id==18273
,等等的可能性。因此他们创建了一个名为userBy的助手函数,可以生成其他函数。换句话说,此代码:

const userBy = id => u => u.id == id; 
。。。是一个工厂,用于生成类似于
user=>user.id==2
的函数,但它不仅可以创建与2比较的函数,还可以创建您想要的任何id

有了它,一行代码如下所示:

Array.prototype.find = function (callback) {
  for (let i = 0; i < this.length; i++) {
    const match = callback(this[i], i, this);
    if (match) {
      return this[i];
    }
  }
}
const user = users.find(userBy(2));

。。。基本上是指“创建函数
user=>user.id==2
,然后将其传递给
users.find

首先,让我们看看find在做什么。.find的实现如下所示:

Array.prototype.find = function (callback) {
  for (let i = 0; i < this.length; i++) {
    const match = callback(this[i], i, this);
    if (match) {
      return this[i];
    }
  }
}
const user = users.find(userBy(2));
或更短:

users.find(user => user.id === 2);

现在,您展示的代码更进一步。它预见到了希望找到
user.id==2
,但也希望找到
user.id==1
,以及
user.id==18273
,等等的可能性。因此他们创建了一个名为userBy的助手函数,可以生成其他函数。换句话说,此代码:

const userBy = id => u => u.id == id; 
。。。是一个工厂,用于生成类似于
user=>user.id==2
的函数,但它不仅可以创建与2比较的函数,还可以创建您想要的任何id

有了它,一行代码如下所示:

Array.prototype.find = function (callback) {
  for (let i = 0; i < this.length; i++) {
    const match = callback(this[i], i, this);
    if (match) {
      return this[i];
    }
  }
}
const user = users.find(userBy(2));

。。。基本上是指“创建函数
user=>user.id==2
,然后将其传递给
users.find

这是因为
userBy
函数实际上没有迭代数组-
数组。find
接受一个返回值为布尔值的函数,因此,执行实际查找的函数是匿名子函数
u=>u.id==id
。以下是ES5中的情况:

var userBy = function(id) {
    return function(u) {
        u.id == id;
    };
};
这里,
userBy
函数返回一个回调/测试函数,该函数用于
Array.find
。如果您不必将
id
作为参数传递,您可以这样简化它,只需使用内部函数:

const userBy = u => u.id == id;
const user = users.find(userBy);

这是因为
userBy
函数实际上并没有迭代数组-
数组。find
接受一个返回值为布尔值的函数,因此执行实际查找的函数是匿名子函数
u=>u.id==id
。以下是ES5中的情况:

var userBy = function(id) {
    return function(u) {
        u.id == id;
    };
};
这里,
userBy
函数返回一个回调/测试函数,该函数用于
Array.find
。如果您不必将
id
作为参数传递,您可以这样简化它,只需使用内部函数:

const userBy = u => u.id == id;
const user = users.find(userBy);

我无法为您提供答案,但请从函数编程中了解这一点:它是一个curried函数
userBy(id)
返回一个函数,该函数用作
find
的回调:因此重写时不带胖箭头:
const userBy=function(id){return function(u){return u.i