【问题标题】:How to get properties of one array of objects into another array of objects如何将一个对象数组的属性获取到另一个对象数组中
【发布时间】:2016-06-20 13:46:16
【问题描述】:

这就是我所拥有的。一组对象:

var teachers = [{
               Year: 2016,
               FullName: "Matt",
               Age: 39
             },
             {
               Year: 2016,
               FullName: "Sara",
               Age: 25
             },
             ...
            ];

还有另一个对象数组。这些将像这样嵌套:

var students = [[
                  {
                    Year: 2016,
                    FullName: "Zoe"
                    Age: 8
                  }
                ],
                [
                  {
                    Year: 2016,
                    FullName: "Lulu"
                    Age: 9
                  },
                  {
                    Year: 2016,
                    FullName: "Leo",
                    Age: 13
                  }
                ],
                [ // empty array here
                ],
                [
                  {
                    Year: 2016,
                    FullName: "Lotta",
                    Age: 11
                  }
                ]
                ...
               ];

他们的组织方式是学生[0]是教师[0]的学生。学生 [4] 是教师 [4] 的学生,依此类推。

我试图做什么来获取每个学生的 FullName 属性“学生”,并将这些值放入一个名为“SundayStudents”的教师新属性的数组中。所以我最终会是:

teachers = [{
             Year: 2016,
             FullName: "Matt",
             Age: 39,
             SundayStudents: ["Zoe"]
            },
            {
              Year: 2016,
              FullName: "Sara",
              Age: 25,
              SundayStudents: ["Lulu", "Leo"]
            },
             ...
          ];

我尝试了一个嵌套的 for 循环,但是学生数组的每个子数组中有不同数量的对象,并且它不会为新属性创建数组。我想我被困住了。

  for (var j = 0, leng = teachers.length; j < leng; j++) {
    for (var k = 0, lent = students.length; k < lent; k++)
      Teachers[i].SundayStudents = Students[j][k].FullName;
  }

欢迎任何提示。

【问题讨论】:

  • 您可以使用.push() 追加到数组。

标签: javascript arrays loops


【解决方案1】:

您可以迭代并检查目标元素是否存在。然后您可以使用映射名称创建一个新属性。

var teachers = [{ Year: 2016, FullName: "Matt", Age: 39 }, { Year: 2016, FullName: "Sara", Age: 25 }],
    students = [[{ Year: 2016, FullName: "Zoe", Age: 8 }], [{ Year: 2016, FullName: "Lulu", Age: 9 }, { Year: 2016, FullName: "Leo", Age: 13 }], [{ Year: 2016, FullName: "Lotta", Age: 11 }]];

students.forEach(function (a, i) {
    if (Array.isArray(a) && teachers[i]) {
        teachers[i].SundayStudents = a.map(function (b) {
            return b.FullName;
        });
    }
});

console.log(teachers);

【讨论】:

  • 我很欣赏地图的使用。感谢您的宝贵时间。
【解决方案2】:

不要过度循环。您可以将外部循环的索引用于教师和学生数组。

for (var i = 0; i < teachers.length; i++) {
  teachers[i].SundayStudents = []
  for (var j = 0; j < students[i].length; j++) {
    teachers[i].SundayStudents.push(students[i][j].FullName);
  }
}

【讨论】:

    【解决方案3】:

    好吧,如果所有学生的元素都是数组(一个二维数组),那么你只需要再添加一个 for 循环来抓取内部数组

    teachers[i].SundayStudents = [];
    for (var j = 0; j < teachers.length; j++) {
        for (var k = 0; k < students.length; k++) {
            var studentSub = students[k];
            for (var l = 0; l < studentSub.length; l++) {
                teachers[j].SundayStudents.push(students[k][l].FullName);
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      你在内部for循环中使用了students.length,它应该是students[j].length,因为它是一个数组。

      var teachers = [{
                     Year: 2016,
                     FullName: "Matt",
                     Age: 39
                   },
                   {
                     Year: 2016,
                     FullName: "Sara",
                     Age: 25
                   }
                  ]
      
      var students = [[
                        {
                          Year: 2016,
                          FullName: "Zoe",
                          Age: 8
                        }
                      ],
                      [
                        {
                          Year: 2016,
                          FullName: "Lulu",
                          Age: 9
                        },
                        {
                          Year: 2016,
                          FullName: "Leo",
                          Age: 13
                        }
                      ],
                      [ // empty array here
                      ],
                      [
                        {
                          Year: 2016,
                          FullName: "Lotta",
                          Age: 11
                        }
                      ]
                      ]
      
      for(var i = 0; i < teachers.length; i++){
          teachers[i].SundayStudents = []
      
          for(var j = 0; j < students[i].length; j++){
              teachers[i].SundayStudents[j] = students[i][j].FullName
          }
      }
      
      console.log(teachers)
      

      【讨论】:

        【解决方案5】:

        使用Array.forEachArray.map函数的解决方案:

        teachers.forEach(function(v, i, arr) { // arr - the array that forEach() is being applied to
            if (Array.isArray(students[i]) && students[i].length) { // check for non-empty array
                arr[i].SundayStudents = students[i].map((st) => st.FullName);
            }        
        });
        
        console.log(JSON.stringify(teachers, 0, 4));
        

        输出:

        [
            {
                "Year": 2016,
                "FullName": "Matt",
                "Age": 39,
                "SundayStudents": [
                    "Zoe"
                ]
            },
            {
                "Year": 2016,
                "FullName": "Sara",
                "Age": 25,
                "SundayStudents": [
                    "Lulu",
                    "Leo"
                ]
            }
            ...
        ]
        

        【讨论】:

          【解决方案6】:

          循环teachers复制对象。添加SundayStudents 作为数组。循环遍历对应索引的students,并将FullName推送SundayStudents

          var teachers = [{
            Year: 2016,
            FullName: "Matt",
            Age: 39
          }, {
            Year: 2016,
            FullName: "Sara",
            Age: 25
          }];
          
          var students = [
            [{
              Year: 2016,
              FullName: "Zoe",
              Age: 8
            }],
            [{
              Year: 2016,
              FullName: "Lulu",
              Age: 9
            }, {
              Year: 2016,
              FullName: "Leo",
              Age: 13
            }]
          ];
          
          var r = [];
          
          teachers.forEach(function(obj, i) {
            var o = {};
            o = obj;
            o.SundayStudents = [];
            students[i].forEach(function(d) {
              o.SundayStudents.push(d.FullName);
            });
            r.push(o);
          });
          
          console.log(r);

          【讨论】:

          • 非常感谢。您的回答有助于了解发生了什么。
          【解决方案7】:

          这似乎是一项简单的地图工作。

          var students = [[
                            {
                              Year: 2016,
                              FullName: "Zoe",
                              Age: 8
                            }
                          ],
                          [
                            {
                              Year: 2016,
                              FullName: "Lulu",
                              Age: 9
                            },
                            {
                              Year: 2016,
                              FullName: "Leo",
                              Age: 13
                            }
                          ],
                          [ // empty array here
                          ],
                          [
                            {
                              Year: 2016,
                              FullName: "Lotta",
                              Age: 11
                            }
                          ]],
          teachers = [{
                       Year: 2016,
                       FullName: "Matt",
                       Age: 39
                      },
                      {
                        Year: 2016,
                        FullName: "Sara",
                        Age: 25
                      },
                      {
                       Year: 2016,
                       FullName: "Yellow Beard",
                       Age: 39
                      },
                      {
                        Year: 2016,
                        FullName: "Professor Oclitus",
                        Age: 25
                      },
                    ];
                    
          teachers = teachers.map((t,i) => (t.SundayStudents = students[i].map(s => s.FullName),t));
          console.log(teachers);

          哇.. 我刚刚注意到有一个完全相同的答案。所以让我给出一个 ES5 兼容的版本。

          teachers = teachers.map(function(t,i) {
                                                  t.SundayStudents = students[i].map(function(s) {
                                                                                                   return s.FullName;
                                                                                                 });
                                                  return t;
                                                });
          

          【讨论】:

          • 非常时髦的缩进风格。
          【解决方案8】:

          仅仅因为它是可能的,这里是一个单行的答案

          teachers.map((t, i) => (t.sundayStudents = students[i].map(s => s.FullName), t));
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-11-27
            • 1970-01-01
            • 1970-01-01
            • 2020-10-29
            • 2019-07-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多