如何在javascript find函数中传递参数?

sam*_*m23 5 javascript

嗨,

我有一个 json 对象,它有一个 id 字段:

document = {
             id: 'some value',
             ...
           }
Run Code Online (Sandbox Code Playgroud)

以及存储此文档的列表。

var list = [{document}, {document} ...]
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试调用列表中的 javascript find() 函数以返回具有特定 id 的文档

list.find( document, id) => {
   if (document.id == id)
   return id
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用。我查了一下,发现id参数值不是我传的,而是列表中文档的索引值。我尝试更改名称,希望它是关键字错误,但结果是 sae。

那么,如何将自定义参数传递给 find 函数?

le_*_*e_m 6

那么,如何将自定义参数传递给 find 函数?

Array.prototype.find接受第二个参数thisArg。您可以使用它来传递自定义参数,如下所示:

function finder(doc) {
   return doc.id === this.id;
}

let list = [{id: 1}, {id: 2}, {id: 3}];
let doc = list.find(finder, {id: 2});
console.log(doc);
Run Code Online (Sandbox Code Playgroud)

但是,如果没有特定需要这种人为的设置,您应该选择更简单的list.find(doc => doc.id === 2). 您可以将硬编码替换2为在外部作用域中声明的变量,如Igor 的回答中所示。


tha*_*han 6

您可以创建一个函数,它接受您想要使用的参数并返回一个函数用作您的查找回调,例如

function findCreator(id) {
   return (item) => item.id === id;
}

let items = [{id: 1}, {id: 2}, {id: 3}];
let matchedItem = items.find(findCreator(2));
console.log(matchedItem);
Run Code Online (Sandbox Code Playgroud)

这对于测试来说是理想的选择,因为您现在可以单独测试回调


Igo*_*gor 5

这是一个回调方法,允许您引用回调范围之外的变量。

例子:

var id = 10;
var foundDoc = list.find((document) => document.id == id);

// alternative syntax
var foundDoc = list.find((document) => {
  return document.id == id;
});
Run Code Online (Sandbox Code Playgroud)

在您的示例中,find采用一个谓词,如果有匹配项,该谓词应返回 true/false。在true(匹配项)第一次出现时,该项目将返回给调用者。