我有一个包含对象数组的JSON对象。我还有一个期望值的数组,我想在JSON中搜索这些值。我只关心第一场比赛。如果找不到匹配项,则抛出错误。
也许有更好的方法可以做到这一点,但这是我想出的:
function myFunction() {
$.getJSON('database.json')
.done(db => {
for (let i = 0; i < desiredValues.length; i++) {
db.arrayOfObjects.forEach(object => {
if (object.propertyValue === desiredValues[i]) {
console.log("Match found!");
return; // break out of myFunction()
}
});
}
throw Error("Match not found.");
})
.fail(error => {
throw Error("getJSON request failed.\n" + error);
})
}
我的问题是return语句仅出现在forEach的当前迭代中(为什么?)。其余对象仍将测试所需的Value的所有剩余值,并且始终会引发错误。找到匹配项后,如何完全退出myFunction();或者如何重组此函数以实现所需的功能?
编辑:我可能应该提到我还需要对匹配的对象进行处理,因此如果 匹配,则 just 不返回true。>
答案 0 :(得分:2)
return
内forEach
的问题在于,它仅终止当前的forEach回调-这就是return
的工作,它会停止当前执行函数,并(可能)返回一个值,而不会影响该函数将来的调用。
请改用两个嵌套的Array.prototype.some
,它们将立即脱离嵌套并在找到匹配项后返回true
,然后完全迭代并返回false
,否则:
const isFound = desiredValues.some(valueToFind => (
db.arrayOfObjcts.some(({ propertyValue }) => (
object.propertyValue === valueToFind
))
));
if (!isFound) {
throw new Error('Match not found');
}
或者,如果您不满意解构参数:
const isFound = desiredValues.some(valueToFind => (
db.arrayOfObjcts.some(object => (
propertyValue === valueToFind
))
));
if (!isFound) {
throw new Error('Match not found');
}
要标识找到的值,请对外部循环使用.find
:
const valueFound = desiredValues.find(valueToFind => (
db.arrayOfObjcts.some(({ propertyValue }) => (
object.propertyValue === valueToFind
))
));
if (!valueFound) {
throw new Error('Match not found');
}
答案 1 :(得分:1)
只需在数组上使用.find
。
function myFunction() {
$.getJSON('database.json')
.done(db => {
for (let i = 0; i < desiredValues.length; i++) {
if (
db.arrayOfObjects
.find(object => object.propertyValue === desiredValues[i])
!== undefined
) {
console.log("Found match! Matched value:", desiredValues[i]);
return;
}
throw Error("Match not found.");
})
.fail(error => {
throw Error("getJSON request failed.\n" + error);
})
}
或映射对象数组,并将.find
与.includes
混合:
function myFunction() {
$.getJSON('database.json')
.done(db => {
const values = db.arrayOfObjects.map(object => object.propertyValue);
const match = values.find(value => desiredValues.includes(value));
if (match !== undefined) {
console.log("Found match! Matched value:", match);
return;
}
throw Error("Match not found.");
})
.fail(error => {
throw Error("getJSON request failed.\n" + error);
})
}
或.filter
以获得所有匹配的值:
function myFunction() {
$.getJSON('database.json')
.done(db => {
const values = db.arrayOfObjects.map(object => object.propertyValue);
const matches = values.filter(value => desiredValues.includes(value));
if (matches.length) {
console.log("Found", matches.length, "matches! Matched values:", matches);
return;
}
throw Error("Match not found.");
})
.fail(error => {
throw Error("getJSON request failed.\n" + error);
})
}