将嵌套的Javascript对象属性推送到多个数组

时间:2015-05-19 17:04:36

标签: javascript arrays angularjs

这是我的对象

 {
    "_id": "555ab225ae9c30b57432e1d2",
    "firstname": "Mindy",
    "lastname": "Martinez",
    "subjects": [
      {
        "name": "Mathematics",
        "grades": {
          "assignments": 16,
          "tests": 4,
          "final": 38
        }
      },{
        "name": "English",
        "grades": {
          "assignments": 10,
          "tests": 12,
          "final": 35
        }
      },{
        "name": "Chemistry",
        "grades": {
          "assignments": 19,
          "tests": 8,
          "final": 3
        }
      },{
        "name": "Physics",
        "grades": {
          "assignments": 4,
          "tests": 26,
          "final": 32
        }
      },{
        "name": "Biology",
        "grades": {
          "assignments": 19,
          "tests": 26,
          "final": 1
        }
      },{
        "name": "F Maths",
        "grades": {
          "assignments": 4,
          "tests": 6,
          "final": 11
        }
      }
    ]
  }

我需要知道如何将主题名称和成绩总数(作业+考试+最终成绩)分成单独的数组科目(科目名称)和分数(作业测试总数和最终成绩)

  var subjects = [];
  var scores = [];
  for(var x in $scope.data.subjects){
    subjects.push(x.name);
  }
  for(var y in $scope.data.subjects){
    scores.push(y.assignments+y.tests+y.final);
  }

继承我的代码http://plnkr.co/edit/RXzjPllg0RSWjvgMjIoU?p=preview

我尝试的是// Data //评论。 Dosent似乎工作,因为雷达图表的标签与数据显示未定义相同的东西

4 个答案:

答案 0 :(得分:2)

您只需将for loops替换为angular.forEach

即可
  angular.forEach($scope.data.subjects, function(x){
    subjects.push(x.name);
  })
  angular.forEach($scope.data.subjects, function(y){
    scores.push(y.grades.assignments+y.grades.tests+y.grades.final);
  })

或者甚至在这样的angular.forEach中:

  angular.forEach($scope.data.subjects, function(x){
    subjects.push(x.name);
    scores.push(x.grades.assignments+x.grades.tests+x.grades.final);
  })

更新了plunker。请参阅scores的控制台。

答案 1 :(得分:1)

您需要更改此循环:

  for(var x in $scope.data.subjects){
    subjects.push(x.name);
  }

到此:

$scope.data.subjects.forEach(function(x) {
    subjects.push(x.name);
  });

在你的例子中,它适用于我。

答案 2 :(得分:1)

你的第一个循环是试图从索引(x)中获取属性'name',这就是你在图表上看到'undefined'的原因。 (索引上的属性'name'未定义。)

我会说Nico在我上面所说的,你不应该在数组中使用'for in'循环,一个简单的for循环就足够了。

与第一个循环相同的问题适用于第二个,索引y没有属性'tests',因此结果是未定义的。另外值得注意的是,您的数据结构没有“测试”作为主题对象的参数,而是主题对象内部的成绩对象,因此要获取您需要使用的数据

subject.grades.tests

获得考试成绩。 (您将使用类似的代码来获取其他分数类型)

此外,您不需要使用两个循环将数据导入两个数组(您的循环完全相同)。

(据我所知)工作代码的样本位如下:

//Data//
var subjects = [];
var scores = [];
var iter;
for(iter = 0; iter < $scope.data.subjects.length; iter = iter + 1)
{
    var x = $scope.data.subjects[iter];
    subjects.push(x.name);
    scores.push(x.grades.tests + x.grades.assignments + x.grades.final);
}

答案 3 :(得分:0)

subjects.push(x.name);更改为subjects.push($scope.data.subjects[x].name);

你不应该在javascript中使用for in数组。我建议您使用简单的for循环。

请参阅Why is using "for...in" with array iteration a bad idea?