我在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');
}
} }
在下图中,您可以看到objects
内array
内和数组内的数据结构。
重点关注3.对象(Answer)第一个console.log显示为false,Array显示为true。
为什么我在声明中无法达到这些对象的活动状态?
我希望有人能给我一个方法提示。 提前致谢。
答案 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);
}