如何搜索一长串javascript对象以查找';已发送:0';

如何搜索一长串javascript对象以查找';已发送:0';,javascript,Javascript,这里有一个主要的循环问题 我的数据如下所示: var mailouts = { signUp: { date: '', sent: 1 }, lesson1: { sent: 1, time: 20 }, lesson2: { sent: 0, time: 20 }, lesson3: { sent: 0, time: 20 }, lesson4: { sent: 0, time: 20 }, lesson5: { sent: 0, tim

这里有一个主要的循环问题

我的数据如下所示:

var mailouts =
   { signUp: { date: '', sent: 1 },
     lesson1: { sent: 1, time: 20 },
     lesson2: { sent: 0, time: 20 },
     lesson3: { sent: 0, time: 20 },
     lesson4: { sent: 0, time: 20 },
     lesson5: { sent: 0, time: 20 } 
     }
if(mailouts.lesson1.sent === 1){
    if(mailouts.lesson2.sent === 1){
        if(mailouts.lesson3.sent === 1){
            if(mailouts.lesson4.sent === 1){
                if(mailouts.lesson5.sent === 1){
                    // Everything has been sent
                }else{
                    // Send lesson5
                }
            }else{
                // Send lesson4
            }
        }else{
            // Send lesson3
        }
    }else{
        // Send lesson2
    }
}else{
    // Send lesson1
}
var lessonToSend = null;
for (var i = 1; i < maxLessons; ++i) {
    if (mailouts['lesson' + i].sent !== 1) {
        lessonToSend = mailouts['lesson' + i];
        break;
    }
}
if (lessonToSend !== null) {
    .... send ....
}
for (var lesson in mailouts) {
    if (mailouts.hasOwnProperty(lesson)) {
        if (lesson.sent === 0) {
            // there it is!
        }
    }
}
var mailouts = [
    { date: '', sent: 1 },
    { sent: 1, time: 20 },
    { sent: 0, time: 20 },
    { sent: 0, time: 20 },
    { sent: 0, time: 20 },
    { sent: 0, time: 20 }
];
我需要遍历
邮件输出
对象,找到下一个要发送的
课程
(按顺序浏览课程时,它是
发送的第一个实例:0
)。我无法控制数据结构,因此需要使用此模型

我能想到的唯一方法是非常难看和难以管理(实际上大约有50个“lesson”对象,而不仅仅是5个,只是为了简洁而保持简短)

我能想到的唯一一件事是这样的:

var mailouts =
   { signUp: { date: '', sent: 1 },
     lesson1: { sent: 1, time: 20 },
     lesson2: { sent: 0, time: 20 },
     lesson3: { sent: 0, time: 20 },
     lesson4: { sent: 0, time: 20 },
     lesson5: { sent: 0, time: 20 } 
     }
if(mailouts.lesson1.sent === 1){
    if(mailouts.lesson2.sent === 1){
        if(mailouts.lesson3.sent === 1){
            if(mailouts.lesson4.sent === 1){
                if(mailouts.lesson5.sent === 1){
                    // Everything has been sent
                }else{
                    // Send lesson5
                }
            }else{
                // Send lesson4
            }
        }else{
            // Send lesson3
        }
    }else{
        // Send lesson2
    }
}else{
    // Send lesson1
}
var lessonToSend = null;
for (var i = 1; i < maxLessons; ++i) {
    if (mailouts['lesson' + i].sent !== 1) {
        lessonToSend = mailouts['lesson' + i];
        break;
    }
}
if (lessonToSend !== null) {
    .... send ....
}
for (var lesson in mailouts) {
    if (mailouts.hasOwnProperty(lesson)) {
        if (lesson.sent === 0) {
            // there it is!
        }
    }
}
var mailouts = [
    { date: '', sent: 1 },
    { sent: 1, time: 20 },
    { sent: 0, time: 20 },
    { sent: 0, time: 20 },
    { sent: 0, time: 20 },
    { sent: 0, time: 20 }
];
当然,Javascript必须有一种更简单的方法来处理这个问题,但我对此一无所知。有什么想法吗


编辑:只是澄清一下,每次运行此脚本时,我只需要发送一个“课程”——仅发送列表中的下一个课程。

您可以使用
in
关键字来迭代对象的属性:

var result = null;
for (lesson in mailouts) {
  if (lesson.indexOf("lesson") == 0 && mailouts[lesson].sent === 0) {
    result = mailouts[lesson];
    break;
  }
}

您可以使用数组表示法动态访问对象的属性。大概是这样的:

var mailouts =
   { signUp: { date: '', sent: 1 },
     lesson1: { sent: 1, time: 20 },
     lesson2: { sent: 0, time: 20 },
     lesson3: { sent: 0, time: 20 },
     lesson4: { sent: 0, time: 20 },
     lesson5: { sent: 0, time: 20 } 
     }
if(mailouts.lesson1.sent === 1){
    if(mailouts.lesson2.sent === 1){
        if(mailouts.lesson3.sent === 1){
            if(mailouts.lesson4.sent === 1){
                if(mailouts.lesson5.sent === 1){
                    // Everything has been sent
                }else{
                    // Send lesson5
                }
            }else{
                // Send lesson4
            }
        }else{
            // Send lesson3
        }
    }else{
        // Send lesson2
    }
}else{
    // Send lesson1
}
var lessonToSend = null;
for (var i = 1; i < maxLessons; ++i) {
    if (mailouts['lesson' + i].sent !== 1) {
        lessonToSend = mailouts['lesson' + i];
        break;
    }
}
if (lessonToSend !== null) {
    .... send ....
}
for (var lesson in mailouts) {
    if (mailouts.hasOwnProperty(lesson)) {
        if (lesson.sent === 0) {
            // there it is!
        }
    }
}
var mailouts = [
    { date: '', sent: 1 },
    { sent: 1, time: 20 },
    { sent: 0, time: 20 },
    { sent: 0, time: 20 },
    { sent: 0, time: 20 },
    { sent: 0, time: 20 }
];
var lessonToSend=null;
对于(变量i=1;i

而且,设计这个数据结构的人是个白痴。课程应该是一个数组。

此代码按顺序处理课程,即使它们在对象中不按顺序处理。迭代对象属性并不能保证任何类型的顺序,所以必须强制执行对象属性本身

var mailouts =
   { signUp: { date: '', sent: 1 },
     lesson1: { sent: 1, time: 20 },
     lesson2: { sent: 0, time: 20 },
     lesson3: { sent: 0, time: 20 },
     lesson4: { sent: 0, time: 20 },
     lesson5: { sent: 0, time: 20 } 
     }

var firstLessonWithNoSent;

for (var lessonNum = 0; lessonNum < 50; lessonNum++) {
  var lesson = mailouts["lesson" + lessonNum];

  if (lesson && lesson.sent === 0) {
    firstLessonWithNoSent = lesson;
    break;
  }
}
var邮件输出=
{注册:{日期:'',发送:1},
第1课:{发送时间:1,时间:20},
第二课:{发送时间:0,时间:20},
第三课:{发送时间:0,时间:20},
第四课:{发送时间:0,时间:20},
第五课:{发送时间:0,时间:20}
}
var firstLessonWithNoSent;
对于(变量lessonNum=0;lessonNum<50;lessonNum++){
var lesson=邮件输出[“lesson”+lessonNum];
如果(lesson&&lesson.sent==0){
第一课Withnosnt=课程;
打破
}
}

只是想说明一下:您使用的是纯JavaScript对象,因此在迭代时无法确定元素的顺序。如果它们是一个数组就更好了

如果我们正在处理一个对象,您可以使用
for。。在
循环中,如下所示:

var mailouts =
   { signUp: { date: '', sent: 1 },
     lesson1: { sent: 1, time: 20 },
     lesson2: { sent: 0, time: 20 },
     lesson3: { sent: 0, time: 20 },
     lesson4: { sent: 0, time: 20 },
     lesson5: { sent: 0, time: 20 } 
     }
if(mailouts.lesson1.sent === 1){
    if(mailouts.lesson2.sent === 1){
        if(mailouts.lesson3.sent === 1){
            if(mailouts.lesson4.sent === 1){
                if(mailouts.lesson5.sent === 1){
                    // Everything has been sent
                }else{
                    // Send lesson5
                }
            }else{
                // Send lesson4
            }
        }else{
            // Send lesson3
        }
    }else{
        // Send lesson2
    }
}else{
    // Send lesson1
}
var lessonToSend = null;
for (var i = 1; i < maxLessons; ++i) {
    if (mailouts['lesson' + i].sent !== 1) {
        lessonToSend = mailouts['lesson' + i];
        break;
    }
}
if (lessonToSend !== null) {
    .... send ....
}
for (var lesson in mailouts) {
    if (mailouts.hasOwnProperty(lesson)) {
        if (lesson.sent === 0) {
            // there it is!
        }
    }
}
var mailouts = [
    { date: '', sent: 1 },
    { sent: 1, time: 20 },
    { sent: 0, time: 20 },
    { sent: 0, time: 20 },
    { sent: 0, time: 20 },
    { sent: 0, time: 20 }
];
但同样,您处理的是顺序数据,因此使用对象没有任何意义。您应该改用数组。所以它可能看起来像这样:

var mailouts =
   { signUp: { date: '', sent: 1 },
     lesson1: { sent: 1, time: 20 },
     lesson2: { sent: 0, time: 20 },
     lesson3: { sent: 0, time: 20 },
     lesson4: { sent: 0, time: 20 },
     lesson5: { sent: 0, time: 20 } 
     }
if(mailouts.lesson1.sent === 1){
    if(mailouts.lesson2.sent === 1){
        if(mailouts.lesson3.sent === 1){
            if(mailouts.lesson4.sent === 1){
                if(mailouts.lesson5.sent === 1){
                    // Everything has been sent
                }else{
                    // Send lesson5
                }
            }else{
                // Send lesson4
            }
        }else{
            // Send lesson3
        }
    }else{
        // Send lesson2
    }
}else{
    // Send lesson1
}
var lessonToSend = null;
for (var i = 1; i < maxLessons; ++i) {
    if (mailouts['lesson' + i].sent !== 1) {
        lessonToSend = mailouts['lesson' + i];
        break;
    }
}
if (lessonToSend !== null) {
    .... send ....
}
for (var lesson in mailouts) {
    if (mailouts.hasOwnProperty(lesson)) {
        if (lesson.sent === 0) {
            // there it is!
        }
    }
}
var mailouts = [
    { date: '', sent: 1 },
    { sent: 1, time: 20 },
    { sent: 0, time: 20 },
    { sent: 0, time: 20 },
    { sent: 0, time: 20 },
    { sent: 0, time: 20 }
];
如果我们有一个阵列,那么解决方案取决于您可以使用ES6的环境
array.prototype.find
如果实现了:

mailouts.find(function (el) {
    return el.sent === 0;
});
如果没有,一个简单的
forEach
就足够了:

mailouts.forEach(function (el) {
    if (el.sent === 0) {
        // there it is!
    }
});

看起来像是
。lesson1
-
。lesson5
应该在一个数组中,这样你就可以通过一个简单的循环遍历一个数组,找到下一个要发送的数组。这很接近——但是如果OP的意思是
首先
通过
最低的#
,那么你不能保证你会按顺序遍历属性。你假设除了课程编号之外,mailouts对象上没有其他属性。在我的Chrome控制台中运行此操作,
firstLessonWithNoSent
返回
undefined
…OP:“我无法控制数据结构,因此需要使用此模型。”