分享
三行代码  ›  专栏  ›  技术社区  ›  kevin

在查找for in循环值时遇到问题

  •  3
  • kevin  · 技术社区  · 1 年前

    当“for in”循环找到值“bill”时,我正试图循环此数组的objects元素并返回“gotcha,bill”。然而,它似乎只返回“不是他”四次。我已经浏览了好几遍了,我不知道我遗漏了什么。这是我第一次使用for-in循环,所以我可能会误解它是如何工作的。

    任何帮助都将不胜感激!

    var names = [{name: 'steven', age: 22}, {name: 'bill', age: 13}];
    
    function findBill(array) {
      for(let i = 0; i < array.length; i++) {
          for(let key in array[i]) {
            if(key === 'bill') {
              return console.log('gotcha, bill');
            } else {
              console.log('not him');
            }
          }
        }
      }
    
    findBill(names)
    
    4 回复  |  直到 1 年前
        1
  •  1
  •   CertainPerformance    1 年前

    for..in 迭代对象的 钥匙 . 自从 bill 是一个值,而不是键, (key === 'bill') 测试永远不会评估为 true .

    如果要迭代对象的值,请使用 Object.values 因为听起来你很想 找到 这个 账单 对象,可以使用 .find :

    var names = [{name: 'steven', age: 22}, {name: 'bill', age: 13}];
    
    function findBill(array) {
      return array.find((obj) => (
        Object.values(obj).includes('bill')
      ))
    };
    
    console.log(findBill(names))

    如果您事先知道该值将在 name 属性,然后只测试该属性,而不是使用 价值观 :

    var names = [{name: 'steven', age: 22}, {name: 'bill', age: 13}];
    
    function findBill(array) {
      return array.find((obj) => (
        obj.name === 'bill'
      ))
    };
    
    console.log(findBill(names))
        2
  •  1
  •   holydragon    1 年前

    在这里。我改变了你 for 循环到 forEach 但这并不是解决你问题的主要方法。这是访问对象属性的方式。我用 前额 因为(对我来说)从对象中获取所需数据会更容易。

    var names = [{name: 'steven', age: 22}, {name: 'bill', age: 13}];
    
    function findBill(array) {
      array.forEach(function(person){
        if(person.name === 'bill') {
          return console.log('gotcha, bill');
        } else {
          console.log('not him');
        }
      });
    }
    
    findBill(names)

    如果你坚持使用 对于 循环。

    var names = [{name: 'steven', age: 22}, {name: 'bill', age: 13}];
    
    function findBill(array) {
      for(let i = 0; i < array.length; i++) {
          if(array[i].name === 'bill') {
            return console.log('gotcha, bill');
          } else {
            console.log('not him');
          }
        }
      }
    
    findBill(names)
        3
  •  1
  •   ggorlen    1 年前

    key 就是——每个物体的键,也就是, name age . 您需要以正确的索引对数组进行实际索引,然后在循环中使用访问要检查的键的值 if (array[i][key] === 'bill') .

    下面是一个工作示例:

    var names = [{name: 'steven', age: 22}, {name: 'bill', age: 13}];
    
    function findBill(array) {
      for(let i = 0; i < array.length; i++) {
          for(let key in array[i]) {
            if(array[i][key] === 'bill') {
              return console.log('gotcha, bill');
            } else {
              console.log('not him');
            }
          }
        }
      }
    
    findBill(names);

    但是,额外的循环不是必需的,并且会导致逻辑错误,因为您可能还有其他一些键,比如, buffalo 这正好有价值 "bill" 最后你会得到一个假阳性。您知道该键,因此可以简单地在数组中搜索具有该键匹配值的任何对象:

    var names = [{name: 'steven', age: 22}, {name: 'bill', age: 13}];
    
    console.log(names.find(e => e.name === "bill"));

    最后,我建议避免 console.log 在函数中,它是 side effect 这限制了可重用性。 控制台日志 收益率 undefined 在打印后,即使在简单或人为的例子中,返回这一点也是误导性的。

        4
  •  1
  •   Derek    1 年前

    你不需要两个回路。实际上你可以使用 Array.find() 方法来查找所需的对象,并根据需要对其进行处理:

    const people = [{name: 'steven', age: 22}, {name: 'bill', age: 13}];
    const findByName = (data, name) => data.find(cur => cur.name === name);
    const Bill = findByName(people, 'bill');
    
    if (Bill === null) { console.log(`could not find bill`); }
    else { console.log(`bill is ${Bill.age} years old`); }