我正在写一封电子邮件自动回复功能,可以发送课程'对会员课程需要按顺序发送。我将其记录在一个名为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
而不是其他任何东西。该数组将始终按此顺序排列,因此可能很容易。
答案 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循环。另一个好主意是尝试Underscore或Lo-dash,因为它们都提供了使JavaScript中的常见内容更容易的功能。当然,他们需要花费更多的代码,但两者都很小(如果确实存在问题,你可以从中提取所需的函数或使用Google Closure编译器来消除死代码)
MDN:break