这是我想做的。然而,forEach中没有“继续”。
var que = null
self.qs.forEach((q) => {
if (q.synchronized == false) {
que = q;
break; // I would like to do this
}
});
// Now que would be set to the first not synchronized
任何人都可以告诉我如何做到这一点。请注意,我使用的是最新的浏览器。请注意我只在数组中查找一个对象,其中synchronized == true。对不起,我之前在我的问题中使用了“继续”。我正在寻找的功能是“休息”。
答案 0 :(得分:1)
使用Array.prototype.find();
:
que = self.qs.find((q, i) => q.synchronized === true);
描述
find方法对数组中存在的每个元素执行一次回调函数,直到找到一个回调返回true值的元素。 如果找到这样的元素,find会立即返回该元素的值。 否则,find返回undefined。仅为已分配值的数组的索引调用回调;对于已删除或从未分配过值的索引,不会调用它。
var self = {
"qs": [{
synchronized: false,
a: "b"
}, {
synchronized: true,
xyz: "abc"
}, {
synchronized: true,
xyz: "abc"
}, {
synchronized: true,
xyz: "abc"
}]
},
que = self.qs.find(function(q, i, arr) {
console.log(i);
return q.synchronized === true
});
document.write(JSON.stringify(que, 0, 4));
答案 1 :(得分:1)
MDN page on forEach
有这样说:
注意:除了抛出异常之外,无法停止或中断forEach()循环。 如果你需要这样的行为,.forEach()方法是错误的工具,而是使用普通循环。如果要测试谓词的数组元素并需要布尔返回值,则可以使用every()或some()代替。
(我的重点)
我认为,鉴于您要求只找到第一个条目,为什么不使用一个简单的循环:
var que = null
for (var i = 0; i < self.qs.length; i++)
{
if (!self.qs[i].synchronized) {
que = self.qs[i];
break;
}
}
简单,直接且易于理解未来代码维护者的具体内容。仅仅因为我们有forEach
,some
,reduce
之类的花哨功能并不意味着您必须在每种情况下使用它们。
答案 2 :(得分:0)
您可以使用Array.prototype.some
:
简短形式:
self.qs.some((q) => {
return (q.synchronized == false) && (que = q, true);
});
或:
self.qs.some((q) => {
if (q.synchronized == false)
{
que = q;
return true;
}
});
或:
self.qs.some(q => (q.synchronized == false) && (que = q, true));
Array.prototype.some
返回第一个返回true的结果。
Array.prototype.every
返回第一个返回false的结果。
它们基本上是测试:
您可以在此处滥用此内容: - )
第三个例子是一些JS-fu但是生成一个很好的oneliner ^ _ ^
完整代码:
var que;
self.qs.some((q) => {
if (q.synchronized == false)
{
que = q;
return true;
}
});
if (que) {
// handle que here
}
未经优化的肮脏黑客:
您也可以使用reduce:
var que = self.qs.reduce((result, q) => {
if (que != null) return result;
return (q.synchronized == false) ? q : result;
}, null);
// js-fu version
var que = self.qs.reduce((result,q) => que || (q.synchronized == false ? q : que),null);
非常不优化,但它可以节省你定义一个变量......但它没有早期出现。