【问题标题】:how to set boolean value to a variable inside an array and check for that value using node js?如何将布尔值设置为数组内的变量并使用节点 js 检查该值?
【发布时间】:2019-06-14 14:23:22
【问题描述】:

我想为 flags[ ] 内的变量设置一个布尔值“true”。那么当flags[ ]里面的所有变量都为真时,我需要做一个操作。

请在下面找到我的代码。

var flags = [terminationFlag,transferFlag,jrCancelledFlag,jrFilledFlag,jrOpenFlag,miegFlags,headcountFlag,replacementReqFlag,costcentreFlag,gradeMapFlag]

var arguments = ["terminationReport - 2019-1", "transferReport - 2019-1", "jrCancelledReport - 2019-1", "jrFilledReport - 2019-1", "jrOpenReport - 2019-1","MIEGReport - 2019-1", "HeadCountReport - 2019-1","ReplacementReport - 2019-1","CostcentreReport - 2019-1","GradeMapReport - 2019-1"]

for (i=0; i < arguments.length ;i++){
    console.log("arguments : "+ arguments[i]);
    request('http://localhost:3000/query/CheckKey/'+arguments[i], function (error, response, body) {
        var result = JSON.stringify(response.body).replace(/[^a-zA-Z ]/g, "");
        if (result == "yes"){
            console.log("record found ****************");
            flags[i]=true;
            console.log("flags : "+ flags);
        }
       if flags = true {
           //do operation
        }
    });

} 

但它不起作用。请帮我解决这个问题。

【问题讨论】:

  • 标志部分是唯一在您的代码中不起作用的部分吗?
  • 是的@holydragon。我需要将值设置为标志 [] 内的变量。这样我就可以检查标志 [] == true 中的值

标签: javascript arrays node.js object for-loop


【解决方案1】:

这可能是因为您在 for 循环内运行异步操作。由于您尚未声明 i,因此它被创建为全局变量。 for 循环只是触发请求,不会等待回调运行。当request 完成时,i 的值更改为其他值,您最终将true 分配给错误的flag 项目。因此,将其更改为:

arguments.forEach((arg, i) => {
  console.log("arguments : " + arg);
  request('http://localhost:3000/query/CheckKey/' + arg, function(error, response, body) {
    var result = JSON.stringify(response.body).replace(/[^a-zA-Z ]/g, "");
    if (result == "yes") {
      console.log("record found ****************");
      flags[i] = true;
      console.log("flags : " + flags);
    }
    if flags = true {
      //do operation
    }
  });
})

或者使用let:

for (let i=0; i < arguments.length ;i++){

} 

【讨论】:

  • 感谢您的响应。它有效。有没有可能我可以设置诸如terminationFlag = true、transferFlag = true、jrCancelledFlag = true、jrFilledFlag = true 之类的值。这样我就可以检查 if (terminationFlag = true && transferFlag = true && jrCancelledFlag = true && jrFilledFlag = true) { //做一些操作 }
  • @Priyanka 您可以保留对布尔值的引用。您必须创建一个将所有这些属性作为键值的对象。或者你必须使用Boolean 对象
【解决方案2】:

如果要检查flags中的每个元素是否为真,请使用Array.every()

if (flags.every(flag => flag)) {...}

或者如果你的浏览器不支持 ES6:

if (flags.every(function(flag) {
    return flag;
})) {...}

【讨论】:

    【解决方案3】:

    这里有两个问题。

    首先,这个 for 循环应该使用 let 进行迭代,尤其是当您在循环内使用异步函数时,因为每次迭代都会保存每个循环的 i 值。

    for (let i=0; i < arguments.length ;i++){
    

    第二,

    if flags = true {
        //do operation
    }
    

    您必须使用任何形式的循环来检查标志数组中的所有标志是否为真。您可以像 Jack Bashford 的回答一样使用 Array.every

    我推荐一个普通的 for 循环,因为它在性能方面更好。

    let allFlagsTrue = true
    for (let j = 0; j < flags.length; j++){
        if (flags[i] === false){
            allFlagsTrue = false
        }
    }
    if (allFlagsTrue){
        // Do your operations
    }
    

    【讨论】:

      猜你喜欢
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      相关资源
      最近更新 更多