Javascript - > for-loop through Array with objects

时间:2017-03-17 16:44:17

标签: javascript arrays object for-loop

我在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过程中处理此活动状态(单击答案)。 为了保存当前的用户选择,我有以下方法,通过上面的数据结构for循环(answer-Array):

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循环只在每次迭代中都给出了错误。

我尝试了几个变量,在循环中使用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');
   }

} }

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

console.log

我希望有人能给我一个方法提示。 提前致谢。

2 个答案:

答案 0 :(得分:0)

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一样使用这个结构

答案 1 :(得分:0)

更简单的方法是使用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);
}