2015-06-20 64 views
-1

除去对象阵列我有具有以下结构的阵列:查找和由值在嵌套数组

var questions = [ 
    {"answer": 
     ["A1", "A2", "A3"] 
    }, 
    {"answer": 
     ["B1"] 
    }, 
    {"answer": 
     ["C1", "C2"] 
    } 
] 

我也有对象的像下面的数组:

var answers = [ 
    {"value": "A1"}, 
    {"value": "A512"}, 
    {"value": ""}, 
    {} 
]; 

对于每个对象在answers(如果它不是{})我想查找相应的值是否出现在questions的某个对象中。如果是这样,我想更新一个counter变量,并从questions中删除该对象。我如何实现这一目标?

+5

什么?这没什么特别的。简单地迭代和比较。 –

+0

您可以详细介绍要删除哪个对象吗?它是questions数组中的整个答案对象,还是例如第二个答案对象在回答对象时使用空数组离开对象的“B1”答案? – 3abqari

+1

您没有JSON数组。你有一个JS数组。 – Oriol

回答

2

试着像您到目前为止已经试过这

var questions = [{ 
    "answer": ["A1", "A2", "A3"] 
}, { 
    "answer": ["B1"] 
}, { 
    "answer": ["C1", "C2"] 
}]; 
var count = 0; 
answers.forEach(function(ans) { 
    var flag = isExists(ans.value); 
    flag && count++; 
}); 
console.log(count); 

function isExists(value) { 

    return questions.some(function(ques) { 
     var ind = ques.answer.indexOf(value); 
     if (ind > -1) { 
      ques.answer.splice(ind, 1); 
      return true; 
     } 
    }); 

} 
+0

我觉得你有点错过了'.some()'的意思。你不需要“标志”。如果你从回调中返回true,'.some()'方法本身返回'true'。所以你需要的是'return questions.some(function(ques){return ques.answer.indexOf(value)> -1;});'如果需要的话,将'.splice()'扔回去。 – 2015-06-20 02:15:05

+2

完美! +1现在使用'.reduce()'而不是'.forEach()',你将成为ECMAScript5摇滚明星! ;-)'var count = answers.reduce(function(c,ans){ return c +(isExists(ans.value)?1:0) },0);' – 2015-06-20 02:24:37

+0

谢谢!我一直坚持了几个小时,但显然无法得到如何编写'.forEach()'和'.some()'的权利。 – yana