【问题标题】:Javascript --> for-loop through Array with objectsJavascript --> for-loop 遍历带有对象的数组
【发布时间】:2017-03-17 16:44:17
【问题描述】:

在 Javascript 调查的背景下,我有以下数据结构。

quest_1: {
  quest: 'Question',
    answers: [
      {text: 'answer 1', active: false, multiple: false},
      {text: 'answer 2', active: false, multiple: false},
      {text: 'answer 3', active: false, multiple: false},
      {text: 'answer 4', active: false, multiple: false},
    ],
    choice: [],
},
...

程序在 userEvents 的过程中操纵这个活动状态(点击一个答案)。 为了保存当前的用户选择,我有以下方法通过上面的数据结构(答案数组)进行循环:

pushAnswer(answers, target){
    for (let i = 0; i < answers.length; i++) {
    console.log(answers[i].active);
    if(answers.active === true){
    target.push(answers.text);
   } else{
   console.log('error');
  }
 }
}

此方法仅在用户做出选择后运行,数据结构的console.log 在单击答案后显示活动状态true(目标参数是另一个用于保存答案的数组(单-和多项选择))。

我的问题:上面的 for 循环在每次迭代中只给出一个 false。

我尝试了几种变体,在循环内使用let 声明变量,但它不起作用。我无法弄清楚问题出在哪里,我可以想象,挑战是这个数组中的对象。

--编辑--

感谢您的信息,我尝试在语句中添加索引,但无法达到活动状态。

修改代码:

pushAnswer(answers, target){
  for (let i = 0; i < answers.length; i++) {
   console.log(answers[i].active);
   console.log(answers[i]);
   if(answers[i].active == true){
   target.push(answers[i].text);
   } else{
    console.log('error');
   }

} }

在下图中,您可以看到objects 内部array 和数组内部的数据结构。 关注 3. object(Answer) 第一个 console.log 显示 false,Array 显示 true。 为什么我无法在我的语句中达到这些对象的活动状态?

我希望任何人都可以给我一个方法提示。 提前致谢。

【问题讨论】:

  • 您缺少answers.activeanswers.text 中的数组索引。替换为answers[i].active 等...
  • 感谢您的回答。我试图更改声明并编辑了我的问题。也许你可以检查我的 console.log 图像。提前致谢。
  • 我刚刚在一系列 4 个问题上运行了您修改后的 pushAnswer,其中第 3 个问题处于活动状态。它工作得很好。我假设您在周围的代码中有错误,例如仅在调用pushAnswer 之后设置active = true(这仍会导致您向我们展示的控制台输出)。
  • 感谢您提供更多信息,问题出在周围的代码中...现在可以使用了!

标签: javascript arrays object for-loop


【解决方案1】:

更简单的方法是使用 Array.filter 删除您不再需要的数组中的项目:

pushAnswer(answers, target){
   const activeAnswers = answers.filter(answer => answer.active === true);
   target.push(...activeAnswers);
}

这很容易成为一条线:

pushAnswer(answers, target){
   target.push(...answers.filter(({active}) => active));
}

我只是把它拆开,以便更清楚。如果你没有 ES6(看起来这是一个类方法,所以我假设你有):

pushAnswer(answers, target){
   var activeAnswers = answers.filter(function(answer) {
       return answer.active === true
   });
   target = target.concat(activeAnswers);
}

如果您只想要匹配对象的.text 属性,您可以添加额外的.map 操作以仅选择该属性:

pushAnswer(answers, target){
   const activeText = answers.filter(({active}) => active)
                             .map(({text}) => text)
   target.push(...activeText);
}

【讨论】:

  • 感谢 Rob 的回答,这是解决此案的聪明方法,我尝试了 ES6 变体!
  • 你好 Rob,由于我的数据结构,我得到了正确的对象,其中包含一个 active = true 作为数组。如何包含声明,即此过滤器的返回将 object.text 设置在“结果数组”中? (而不是“仅”相关的整个对象)。 -再次感谢您的支持。
  • @Sash84 没问题,很高兴为您提供帮助!我更新了我的答案来解决这个问题。
【解决方案2】:
var sample = [{a:1, b:1}, {a:2, b:2}];
for(var index in sample){
  if(sample.hasOwnProperty(index){
    var obj = sample[index];
    console.log(obj.a + ' ' + obj.b);
  }
}

像 foreach 一样使用这个结构

【讨论】:

  • 感谢您的回答。我用我的 for-loop 语句的新尝试编辑了我的问题,但无法弄清楚为什么显示的 console.log 无法达到此数组中的活动状态。
猜你喜欢
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 1970-01-01
  • 2021-11-16
  • 2015-10-15
相关资源
最近更新 更多