【问题标题】:What is the correct syntax for an IF statement in a FOR loop? [closed]FOR 循环中 IF 语句的正确语法是什么? [关闭]
【发布时间】:2019-09-18 15:25:52
【问题描述】:

我正在尝试使用其他两个数组的组合值填充一个数组,并尝试使用 for 循环来执行此操作。

var filterTables = ["1","2","3"]
var filterValues = ["Egypt",,"Ghana"]

for (i = 0; i < filterValues.length ; i++) {        
  if (filterValues[i]) { 
    for (i = 0; i < filterValues.length ; i++) {
      var filter = '{field: '+filterTables[i]+',value:'+filterValues[i]+',operator:"="},'
      filterArray.filters.push(filter)       
      if (i===3) {
         '{field: "'+filterTables[i]+'",value:"'+filterValues[i]+'",operator:"="}'
      }
    }
  } 
}

但是 FOR 循环根本没有执行,我认为这是因为第一个 IF 语句检查当前 [i] 位置是否有值。是否被正确使用?我需要在 FOR 循环之外使用 IF 语句吗?

这是想要的结果:

var filter = '{field: '1',value:'Egypt',operator:"="}'
var filter = '{field: '3',value:'Ghana',operator:"="}'

【问题讨论】:

  • 您在两个循环中都使用了变量i。这是一个错误。
  • 顺便说一句,你为什么不使用JSON.stringify() 而不是手动构造这些字符串?
  • 你不需要两个 for 循环来获得你想要的结果
  • 对,嵌套循环用于从两个数组中获取所有组合。如果你想并行组合它们,你只需使用一个循环并使用两个数组的索引。
  • @MarcoDalZovo 发布一个答案,展示如何正确地做到这一点。

标签: javascript for-loop if-statement


【解决方案1】:

这里有几个问题:

1- 变量filterArrayfilterArray.filters 是什么?它们是否在您的代码中定义?我认为它们不是,因为一旦我添加了声明,循环就会按预期执行。

2- 正如许多 cmets 所指出的,您不需要嵌套循环来达到所需的结果(另外,您在两个循环中使用相同的计数器 i,这肯定会导致问题)。

您可以使用一个循环,在每次迭代时读取filterTables[i]filterValues[i],并相应地填充一个对象。

顺便说一句,为什么不使用JSON.stringify 来构建您的 JSON 字符串?

var filterTables = ["1","2","3"];
var filterValues = ["Egypt",,"Ghana"];
var filterArray = {'filters': []}; //added variable declaration for the object `filterArray` and its property `filters`

for(var i = 0; i < filterValues.length; i++) {
  if(filterValues[i]) {
    var filter = JSON.stringify({
      field: filterTables[i], //I assume here you could just use i+1
      value: filterValues[i],
      operator: '='
    });
    
    filterArray.filters.push(filter);
  }
}

console.log(filterArray.filters);

【讨论】:

  • 谢谢。效果很好。
【解决方案2】:

要得到你问的结果,这就是你应该实现的逻辑:

// Why did you call Array an Object?
// That sounds better
let filterObject = {
  filters: []
};
let filterTables = ['1','2','3'];
let filterValues = ['Egypt',,'Ghana'];

// Here you need only one for loop
// Each cycle, you increment i by 1 and access next element in filterValues array
for(let i = 0; i < filterValues.length; i++) {
  let value = filterValues[i];
  if(!value) continue; // If the value does not exist, you can continue and avoid useless logic
  
  // Here you can access current table element (from filterTables array) using i
  let table = filterTables[i];
  
  // Don't create an object using string
  // Create it as object (yeah, seems like crazy :D) instead
  let filter = {
    field: table,
    value: value,
    operator: '='
  };
  
  filterObject.filters.push(filter);
}

console.log(filterObject);

请注意,如果需要 JSON 格式的对象,可以直接调用 filter 对象上的 stringify 方法,如下所示:

JSON.stringify(filter);

【讨论】:

    【解决方案3】:

    正如@Pointy 提到的,您在两个循环中都使用了“i”,这是一个错误。 但是,有一种更好的方法可以实现您正在尝试的目标。 ES6 来救援!

    试试这个: (我已经测试过它工作正常)

    let filterArray = { filters: [] };
                var filterTables = ["1", "2", "3"];
                var filterValues = ["Egypt", , "Ghana"];
    
                let result = filterValues.map(function (x, i) {
                    if (x) {
                    return { "field": filterTables[i] , "value": x }
                    }
                })
    
                console.log(result)
    

    【讨论】:

    • 简洁的解决方案。但根据 OP 的预期输出,我相信 field 应该设置为 i + 1 而不是 i
    • 感谢您指出@AnisR。我已经编辑了我的答案。
    • 这不太对。您不能假设该字段将永远是数字...在我看来,最好使用数组中的值
    • 是的,我明白你的观点@MarcoDalZovo,我的错。已编辑!
    猜你喜欢
    • 2015-04-21
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多