我正在设置一个初始标志,然后执行一个foreach,它将标志更改为另一个值,但是在foreach循环之外,我仍然看到原始标志。好像什么都没有改变。但是它确实在foreach循环内发生了变化
该值仅在foreach循环内更改,而不在其外部更改。
我看到了许多类似的问题,但是它们都处理实际的数组值,在这种情况下,它是foreach循环之外的一个简单变量。
var arr = ["one"];
var str = 0;
arr.forEach(function(part){
if(part == 'one') {
var str = 1;
console.log('str changed to: ' + str);
}
})
console.log('str is now: ' + str);
这将返回
str changed to: 1
str is now: 0
根据我上面的PHP逻辑,应该返回“ str is now:1 ”,为什么它的原始值为0?
答案 0 :(得分:2)
这是因为您要在循环中使用var
重新声明变量,而不仅仅是更新/设置它。重新声明它会清除先前循环迭代中同名的较早变量,并在更高范围的函数中隐藏该变量。它建立了一个新值,而不只是更新现有值。
var arr = ["one"];
var str = 0;
arr.forEach(function(part){
if(part == 'one') {
str = 1;
console.log('str changed to: ' + str);
}
})
console.log('str is now: ' + str);
答案 1 :(得分:2)
问题在于您要在str
内声明一个 new forEach
变量。只需放下var
即可。
var arr = ["one"];
var str = 0;
arr.forEach(function(part) {
if (part == 'one') {
str = 1; // Notice the lack of var
console.log('str changed to: ' + str);
}
});
console.log('str is now: ' + str);
答案 2 :(得分:1)
作为一个额外的答案,它想建议使用forEach
做事的另一种方式:
Array.prototype.some()
在这里做得很好。它会测试是否有任何数组元素满足传递给它的回调函数中的条件。
let arr = ["two", "one", 7];
let str = 0;
str = arr.some(part => part === 'one') ? 1 : str;
console.log('str is now: ' + str);
答案 3 :(得分:0)
let answers = [
{
questionId: "questionId1",
answer: "answer1",
},
{
questionId: "questionId2",
answer: "answer2",
}
]
现在,我使用了forEach循环,我需要在forEach循环内进行查询。所以我所做的是使用for代替forEach
以前
let score = 0
let question
answers.forEach(async(obj) => {
// Query obj.questionId here
question = await Question.findOne({id: obj.questionId)
if(obj.answer == question.answer){
score += 1
}
})
console.log(score)
在我的情况下,上述方法不起作用,因为在收到问题查询的响应之前,已成功执行了上面记录的评分。
现在let score = 0
let question
for(obj of answers){
question = await Question.findOne({id: obj.questionId)
if(obj.answer == question.answer){
score += 1
}
}
console.log(score)
最后,我很高兴,这就是我需要做的。那么,为什么不使用for而不是forEach也要开心。大声笑