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);
}