如何使用angular.forEach计算嵌套对象值?

时间:2015-09-03 20:45:56

标签: javascript json angularjs for-loop

我的对象:

service: {
    categories: [0: {
            name: "category1",
            id: 2,
            questions: [0: {
                id: 1,
                question: "example trivia question here",
                value: 1
            }]]
    }

基本上,我需要找到声明中存在值的位置并计算它。

$scope.questionCount = 0;

angular.forEach($scope.service, function(categories, questions) {
  for (var i = 0; i < questions.length; i++) {
    if (questions[i].value !== null){
      $scope.questionCount += 1
    }
}
});

这是我尝试过的,但是当我在console.log时,我仍然得到0.我没有错误地循环或者没有正确检查该值。任何帮助,赞赏。

4 个答案:

答案 0 :(得分:1)

首先,你的数据对象没有多大意义(至少对我来说)。为了提醒我的答案,我假设您的对象看起来像这样:

var categories = [
    {
        name: "category1",
        id: 1,
        questions: [
            {
                id: 1,
                question: "example trivia question here",
                value: 2
            }, {
                id: 2,
                question: "example trivia question here",
                value: 3
            }]
    },
    {
        name: "category2",
        id: 2,
        questions: [
            {
                id: 3,
                question: "example trivia question here",
                value: 5
            }
        ]
    },
    {
        name: "category3",
        id: 3
    }
];

计算此对象中的问题数量可以通过多种方式完成,可以通过循环搜索问题,也可以使用例如像这样的reduce函数:

$scope.questionCount = categories.reduce(function(prev, curr){
    return (curr.questions) ? prev.concat(curr.questions) : prev;
}, []).length; 

这将从每个类别中提取问题数组,并将它们连接成一个数组。问题总数是此数组的length,在本例中为3.

您可以在此处详细了解reduce功能:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

如果你想对每个问题'value属性求和,你可以用更多的map / reduce魔法来填充它,如下所示:

$scope.questionCount = categories
        .reduce(function(prev, curr){
            return (curr.questions) ? prev.concat(curr.questions) : prev;
        }, [])
        .map(function(q){ 
            return (q.value)? q.value : 0;
        })
        .reduce(function(prev, curr){
            return prev + curr;
        }, 0);

第一个减少与前一个示例完全相同。 map函数将问题数组转换为仅包含value属性值的数组,即[2,3,5]。第二个reduce将这些数字相加。在这种情况下,$scope.questionCount将是10。

地图功能:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

答案 1 :(得分:0)

坦率地说,代码段中的angular.forEach循环完全是胡说八道。

Please read it up hereangular.forEach用于遍历对象键(例如Array.prototype.forEach循环遍历数组索引)。

提示:对此的正确解决方案甚至不需要angular.forEach:您只需使用Array.prototype.forEach即可。 Please read it up如果你想学习如何使用它。

此外,即使在正常的for循环中,您也应该使用i作为索引,因为questions是一个数组,如果要将1添加到变量,请使用++

答案 2 :(得分:0)

该行

$scope.questionCount + 1;

什么都不做。你应该做

$scope.questionCount += 1;

$scope.questionCount++;

答案 3 :(得分:0)

您需要存储新值$scope.questionCount += 1$scope.questionCount++;