如何给javascript find()方法一个参数来搜索?

时间:2017-05-19 23:03:05

标签: javascript find

我试图找出一种在迭代数组时进行搜索的方法。我遇到了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()一个参数并找到该参数的匹配基础?如果没有,什么方法允许我动态搜索对象数组?

5 个答案:

答案 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)

虽然闭包是标准方法,但你也可以提供thisArgArray.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)thisObject,需要通过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"]