循环遍历Javascript对象数组以查找满足特定条件的第一个条目

时间:2014-04-18 00:51:35

标签: javascript arrays

我正在写一封电子邮件自动回复功能,可以发送课程'对会员课程需要按顺序发送。我将其记录在一个名为mailouts的对象数组中:

 var obj = {
     mailouts:         [ 
        {name: 'signUp', date: '', sent: 1 },
        {name: 'lesson1', sent: 1, time: 11 },
        {name: 'lesson2', sent: 1, time: 11 },
        {name: 'lesson3', sent: 1, time: 11 },
        {name: 'lesson4', sent: 1, time: 11 },
        {name: 'lesson5', sent: 0, time: 11 },
        {name: 'lesson6', sent: 0, time: 11 },
        {name: 'lesson7', sent: 0, time: 11 }
    ]
  }

我需要遍历上面的列表并返回其sent === 0

的第一个对象

我可以通过以下方式轻松遍历列表:

 for(var i = 0; i<obj.mailouts.length; i++){
    if(obj.mailouts[i].sent === 0){
       var nextLessonToSend = obj.mailouts[i];
    }
 }

然而,如果sent === 0项有多个项目,这显然不会起作用,因为它只返回序列中的最后一项。

条件是代码必须始终返回编号最小的对象,无论。也就是说,它应该返回lesson5而不是其他任何东西。该数组将始终按此顺序排列,因此可能很容易。

3 个答案:

答案 0 :(得分:1)

var nextLessonToSend = null;
for(var i = 0; i<obj.mailouts.length; i++){
    if(obj.mailouts[i].sent === 0){
       nextLessonToSend = obj.mailouts[i];
       break;
    }
}
if (nextLessonToSend) {
    //whatever
}

应该做的伎俩。记住break

答案 1 :(得分:1)

Array.prototype.some可用于您所需的内容。它将迭代数组,并在找到发送属性等于0的第一课时终止。

var nextLessonToSend;
obj.mailouts.some(function (mail) {
  var isNextLesson = mail.sent === 0;
  if (isNextLesson) nextLessonToSend = mail;
  return isNextLesson;
});

请注意,some已添加ES5,因此,如果没有some(请参阅MDN链接以了解详情),请考虑您的平台是什么以及如何处理它。 / p>

答案 2 :(得分:0)

当您符合条件时,可以使用break退出for循环:

 for (var i = 0; i < obj.mailouts.length; i++){
    if (obj.mailouts[i].sent === 0) {
       var nextLessonToSend = obj.mailouts[i];
       break;
    }
 }

如果在for循环中有for循环,则需要使用变量来跟踪内部条件是否已匹配(或使用循环条件):

var found = false,
    thingLookingFor;

for (var i = 0; i < something.length; i++) {
  for (var j = 0; j < other.length; i++) {

    if (something === true) {
      thingLookingFor = ...;
      found = true;
      break;
    }      
  }

  if (found) {
    break;
  }
}

您可以使用循环条件来简化上述代码:

var lesson;

for (var j = 0; !lesson && j < something.length; j++) {
  for (var i = 0; i < obj.mailouts.length; i++) {
    if (obj.mailouts[i].sent === 0) {
      lesson = obj.mailouts[i];
      break;
    }
  }
}

!lesson设置为您的预期值时,您必须小心{{1}}计算结果为true。在提供的示例中,它将正常工作。

值得考虑如何重构代码以避免for中的for循环。另一个好主意是尝试UnderscoreLo-dash,因为它们都提供了使JavaScript中的常见内容更容易的功能。当然,他们需要花费更多的代码,但两者都很小(如果确实存在问题,你可以从中提取所需的函数或使用Google Closure编译器来消除死代码)

MDN:break