无法通过for-in循环寻找价值

时间:2018-12-25 01:55:20

标签: javascript arrays

我试图遍历该数组的对象元素,并在“ for in”循环找到值“ bill”时返回“ 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 个答案:

答案 0 :(得分:1)

这里。我将您的for循环更改为forEach,但这并不是解决问题的主要方法。这是您访问对象属性的方式。我使用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)

如果您坚持使用for循环,这应该是这样。

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)

答案 1 :(得分:1)

key就是这样-每个对象的键,即nameage。您实际上需要以正确的索引索引到数组中,然后使用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 effectconsole.log在打印后返回undefined,因此即使在简单的或人为的示例中也要返回该值,这是一种误导。

答案 2 :(得分: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`); }

答案 3 :(得分:1)

for..in遍历对象的。由于bill是一个值,而不是键,因此(key === 'bill')测试将永远不会得出true

如果您想遍历对象的值,请使用Object.values,由于听起来您想查找 bill对象,因此可以使用{{ 1}}:

.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

Object.values