嗨,
我有一个 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 函数?
那么,如何将自定义参数传递给 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 的回答中所示。
您可以创建一个函数,它接受您想要使用的参数并返回一个函数用作您的查找回调,例如
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)
这对于测试来说是理想的选择,因为您现在可以单独测试回调
这是一个回调方法,允许您引用回调范围之外的变量。
例子:
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(匹配项)第一次出现时,该项目将返回给调用者。