Javascript 在为每个循环指定新值时进行干燥
考虑一个函数Javascript 在为每个循环指定新值时进行干燥,javascript,loops,while-loop,dry,assign,Javascript,Loops,While Loop,Dry,Assign,考虑一个函数query\u item,它要么返回要处理的对象,要么返回null,如果不再处理任何对象 let item = query_item(); while(item !== null){ process(item); item = query_item(); } 显然,这是对DRY的一个小小的违反(不要重复),主要通过将query\u item()作为一个专用函数来缓解 我知道在这个简单的例子中,清晰比防止重复更重要 然而,有没有一种方法可以在不重复赋值的情况下编写这样
query\u item
,它要么返回要处理的对象,要么返回null
,如果不再处理任何对象
let item = query_item();
while(item !== null){
process(item);
item = query_item();
}
显然,这是对DRY的一个小小的违反(不要重复),主要通过将query\u item()
作为一个专用函数来缓解
我知道在这个简单的例子中,清晰比防止重复更重要
然而,有没有一种方法可以在不重复赋值的情况下编写这样的循环?
我唯一想到的是for-loop方法,但它有相同的重复,至少在我看来,读起来有点难
for(let item = query_item();
item !== null;
item = query_item()
){
process(item);
};
漂亮一点
let item;
do {
item = query_item();
if (item) process(item);
} while (item !== null)
这是一个标准场景,其中在
条件下使用赋值:
let item;
while (item = query_item()) {
process(item);
}
或者,如果您希望明确:
let item;
while ((item = query_item()) !== null) {
process(item);
}
您还可以使用相同的方法使用for
循环,这也为let
提供了块范围:
for (let item; item = query_item(); ) {
process(item);
}
对于javascript,我相信您可以编写:
while(let item = query_item() && item){
process(item);
}
如果你想完全避免这个赋值古怪,得到最简单的循环语法,你可以考虑使用A:
或者更好地立即实现查询项目。作为
…是一个在遇到null
值时终止的值:
function* iterate(cb) {
let next = cb();
if (next === null) return;
yield next, yield* iterate(cb);
}
for (let item of iterate(query_item)) {
process(item);
}
可能会帮到你。我建议else break;}while(true)
以避免重复进行两次测试。当只使用if(item)
时,您现在有两种不同的条件来执行过程和中断循环@Bergi对此有一个很好的解决方案,但它几乎比他的答案更漂亮。你测试过那个作业吗?@MatheusValienteSouza他有25万个代表,他不需要,他知道,对,我试过里面的声明,但没有效果,但作业似乎很完美@MatheusValienteSouza我不明白那项任务怎么会不起作用。我遗漏了什么吗?@iFreilicht我仍然认为声明应该是一个返回指定值的表达式,但这就是为什么…只是指出,对于语言学习者来说,
的第一个while
和最后一个for
循环在遇到未定义的,“
时额外终止,0
,false
和NaN
。
let item;
while (item = query_item()) {
process(item);
}
function* iterate(cb) {
let next = cb();
if (next === null) return;
yield next, yield* iterate(cb);
}
for (let item of iterate(query_item)) {
process(item);
}