【问题标题】:How to give javascript find() method an argument to search?如何为 javascript find() 方法提供搜索参数?
【发布时间】:2017-05-19 23:03:05
【问题描述】:

我正在尝试找出一种在迭代数组时进行搜索的方法。我遇到了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() 一个参数并根据该参数找到一个匹配项?如果没有,什么方法可以让我动态搜索对象数组?

【问题讨论】:

  • 搜索/阅读 Eloquent JavaScript。第二种形式的“问题”是代码在应该传递函数对象时急切地评估函数调用;这可以通过闭包轻松解决。
  • 啊,我明白了! “cherries”不是一个函数,这就是它不起作用的原因。在阅读了下面的 cmets 之后,有一个带有动态参数存根的回调参数是有意义的。谢谢!

标签: javascript find


【解决方案1】:

使用像这样的闭包(你的函数必须返回一个函数):

function findFruitByName(name) {
    return function(fruit) {
        return fruit.name === name;
    }
}

inventory.find(findFruitByName('cherries'))
// {name: "cherries", quantity: 5}

【讨论】:

    【解决方案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));

    【讨论】:

      【解决方案3】:

      虽然闭包是标准方法,但您也可以将 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),但它是can definitely come in handy。

      【讨论】:

      • 与其他答案相比,这是一种有趣的方法。感谢分享技巧!
      【解决方案4】:

      有没有办法给 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()方法也不支持,所以...)

      【讨论】:

        【解决方案5】:

        你可以使用find方法的thisArg作为参数,就像下面的代码一样(我使用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"]

        【讨论】:

          猜你喜欢
          • 2013-01-20
          • 1970-01-01
          • 2020-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-17
          • 2019-04-04
          相关资源
          最近更新 更多