我试图找出一种在迭代数组时进行搜索的方法。我遇到了find()
method。
以下是给出的例子:
var inventory = [
{name: 'apples', quantity: 2},
{name: 'bananas', quantity: 0},
{name: 'cherries', quantity: 5}
];
function findCherries(fruit) {
return fruit.name === 'cherries';
}
console.log(inventory.find(findCherries));
// { name: 'cherries', quantity: 5 }
我需要找到一个动态的水果名称,但我无法弄清楚如何去做。简而言之,我正在尝试做类似的事情:
function findCherries(fruit, fruitName) {
return fruit.name === fruitName;
};
inventory.find(findCherries('cherries'))
//"true is not a function"
有没有办法给find()
一个参数并找到该参数的匹配基础?如果没有,什么方法允许我动态搜索对象数组?
答案 0 :(得分:5)
使用闭包(你的函数必须返回一个函数),如下所示:
function findFruitByName(name) {
return function(fruit) {
return fruit.name === name;
}
}
inventory.find(findFruitByName('cherries'))
// {name: "cherries", quantity: 5}
答案 1 :(得分:2)
试试这个
// find one
function findFruitByName(name, inventoy) {
return inventory.find(function(item) {
return item.name === name;
});
}
// find all
function findFruitsByName(name, inventory) {
return inventory.filter(function(item) {
return item.name === name;
});
}
let inventory = [
{name: 'apples', quantity: 2},
{name: 'bananas', quantity: 0},
{name: 'cherries', quantity: 5},
{name: 'cherries', quantity: 88}
];
console.log('One', findFruitByName('cherries', inventory));
console.log('All', findFruitsByName('cherries', inventory));

答案 2 :(得分:2)
虽然闭包是标准方法,但你也可以提供thisArg
到Array.prototype.find
并写:
var inventory = [
{name: 'apples', quantity: 2},
{name: 'bananas', quantity: 0},
{name: 'cherries', quantity: 5}
];
function findFruit(fruit) {
return fruit.name == this;
};
console.log(inventory.find(findFruit, 'cherries'));

我不推荐这种方法,因为a)不太明显,b)this
是Object
,需要通过string
强制转换为原始==
非严格平等String(this)
或直接转换为<%= simple_form_for @message do |f| %>
<%= f.error_notification %>
<%= f.input :content, label: "Your message" %>
<%= f.input :target_user_id, label: "Who are you sending your message to?" %>
<%= hidden_field_tag 'user_id', current_user.id %>
<%= hidden_field_tag 'sender_email', current_user.email %>
<%= f.button :submit %>
<% end %>
,但can definitely come in handy。
答案 3 :(得分:1)
有没有办法给find()一个参数并找到该参数的匹配基础?
是。你的第一个代码示例已经这样做了:你正在使用的参数是一个寻找樱桃的函数。
传递给.find()
的参数必须是一个知道如何进行所需比较的函数。可以在您需要的地方匿名定义此比较功能:
let result = inventory.find(function(item) {
return item.name === "cherries";
});
您可以使用arrow function来缩短代码:
let result = inventory.find(item => item.name === "cherries");
因此,如果您要查找的值是其他变量:
let fruit = "cherries";
let result = inventory.find(item => item.name === fruit);
// OR
let result = inventory.find(function(item) {
return item.name === fruit;
});
(注意IE不支持箭头功能,但是`.find()方法也不支持,所以......)
答案 4 :(得分:0)
您可以使用thisArg
方法的find
作为参数,如下面的代码(我使用filter
,您也可以使用find
)
var myFind = function(el) {
return (el.indexOf(this) !== -1); // check if 'el' string contains an 'arg' substring
};
console.log(["abc", "123", "xya", "xyz"]
.filter(myFind, "a")); // the argument is "a"
//output: ["abc", "xya"]