在foreach循环中更改变量的值?使它在循环外可用

时间:2019-05-22 22:54:58

标签: javascript

我正在设置一个初始标志,然后执行一个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?

4 个答案:

答案 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)

所以我遇到了挑战,需要在forEach循环中等待查询,这给了我很多问题。所以我只需要使用for ... of而不是forEach。
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也要开心。大声笑