Hie,
У меня есть объект json, у которого есть поле id:
document = {
id: 'some value',
...
}
И список для хранения этих документов.
var list = [{document}, {document} ...]
Теперь я пытаюсь вызвать функцию javascript find() в списке, чтобы вернуть документ с определенным id как
list.find( document, id) => {
if (document.id == id)
return id
}
Но это не работает. Я проверил и обнаружил, что значение параметра id не является тем, что я передаю, но значением индекса документа в списке. Я попытался изменить имя, надеясь, что это ошибка с ключевым словом, но результат sae.
Итак, как передать пользовательский параметр функции find?
Это метод обратного вызова, который позволяет ссылаться на переменные за пределами области обратного вызова.
Пример:
var id = 10;
var foundDoc = list.find((document) => document.id == id);
// alternative syntax
var foundDoc = list.find((document) => {
return document.id == id;
});
В вашем примере find принимает предикат, который должен возвращать true/false, если есть совпадение. При первом обнаружении true
(совпадения) этот элемент возвращается вызывающему.
Итак, как передать пользовательский параметр функции 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);
Однако, если нет никакой конкретной потребности в такой надуманной установке, вам стоит пойти с гораздо более простым list.find(doc => doc.id === 2)
. Вы можете заменить hardcoded 2
на переменную, объявленную во внешней области, как показано в ответе Игоря.
Вы можете создать функцию, которая использует параметр, который вы хотите использовать, и возвращает функцию, используемую в качестве вашего обратного вызова поиска, например
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);
Это было бы идеально для тестирования, так как теперь вы можете протестировать обратный вызов отдельно