用于查找匹配属性值的JavaScript for循环在第一个对象之后停止迭代

时间:2017-03-26 11:38:21

标签: javascript arrays loops for-loop

我对for loop在JS工作的方式有误解...... 对于这个数组:

var names = [
  {
    "firstName" : "Tom",
    "LastName"  : "Delavoir"
  },
  {
    "firstName" : "Yop",
    "LastName"  : "laboum"
  },
  {
    "firstName" : "Andrea",
    "LastName"  : "hop"
  }
];

以下此功能适用于第一个firstName,但从不检查数组names中的下一个元素。

function ifExist(firstName, prop){

  for (var i=0; i < names.length; i++) {
    if (firstName == names[i].firstName){
      return true;
    } else {
      return false;
    }
  }
}

这将始终返回trueifExist("Tom", "LastName");

但这始终会返回falseifExist("Yop", "LastName");

我可以全神贯注地检查所有names[i].firstName以验证参数ifExist()中的第一个是否为真,而不仅仅是表格的第一个元素......

6 个答案:

答案 0 :(得分:2)

那是因为你在第一次迭代时返回,给你的循环没有机会循环。

请注意,您可以使用一些更简单的方法来执行您想要的操作,例如使用some()

var names = [
  {
    "firstName" : "Tom",
    "LastName"  : "Delavoir"
  },
  {
    "firstName" : "Yop",
    "LastName"  : "laboum"
  },
  {
    "firstName" : "Andrea",
    "LastName"  : "hop"
  }
];

function exists(arr, myName, prop) {
  return arr.some(v => v[prop] === myName);
}


console.log(exists(names, "Yop", "firstName"));

答案 1 :(得分:1)

在循环完成后你需要return false ,否则你永远不会通过你的数组经过一次迭代。您每次都使用firstName作为属性,而不是使用动态字符串prop(这要求您在函数调用中将LastName更改为firstName

&#13;
&#13;
var names = [
  {
    "firstName" : "Tom",
    "LastName"  : "Delavoir"
  },
  {
    "firstName" : "Yop",
    "LastName"  : "laboum"
  },
  {
    "firstName" : "Andrea",
    "LastName"  : "hop"
  }
]

function ifExist (value, prop){
  for (var i = 0; i < names.length; i++) {
    if (value === names[i][prop]) return true
  }
  return false
}

console.log(ifExist("Tom", "firstName"))

console.log(ifExist("Yop", "firstName"))
&#13;
&#13;
&#13;

答案 2 :(得分:1)

你在第一次迭代中返回true / false,然后循环dosent进一步运行。该函数自己返回。 只需删除else部分并在循环后返回false。

答案 3 :(得分:1)

您在第一次迭代时停止for循环,因为您在true和false情况下返回。你需要这样的东西:

function ifExist(firstName, prop){
  for (var i=0; i < names.length; i++) {
    if (firstName === names[i].firstName){
      return true;
    }
  }
  return false;
}
console.log(ifExist('Tom'))
console.log(ifExist('Yop'))

答案 4 :(得分:1)

让我们解决这个function

function ifExist(firstName, prop){

  for (var i=0; i < names.length; i++) {
    if (firstName == names[i].firstName){
      return true;
    } else {
      return false;
    }
  }
}

到这个

function ifExist(search, prop){

  for (var i=0; i < names.length; i++) {
    if (search == names[i][prop]){
      return true;
    }
  }
  return false;
}

修正了什么:

  • return编辑了第一次迭代是否匹配,这肯定是你不想要的return。为了解决这个问题,我在return false;之后移动了for,因此您在第一个找到的元素上return true;,如果找不到任何元素,那么return false
  • 您有一个prop参数,但您从未使用过它。无论firstName如何,您都检查了prop。我在检查值
  • 时使用prop修复此问题

答案 5 :(得分:0)

在名字数组的第一次迭代中,值为(firstName == names [i] .firstName) 是真还是假,并根据每种情况函数返回的编写代码,编写如下代码:

    var find=false;
    for (var i=0; i < names.length; i++) {
        if (firstName == names[i].firstName){
             find=true;
             break;
      } 
     }
  return find;