2016-06-20 2 views
2

Вот что у меня есть. Один массив объектов:Как получить свойства одного массива объектов в другой массив объектов

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 (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; 
    } 

Любые подсказки приветствуются.

+0

Вы можете использовать '.push()' для добавления в массив. –

ответ

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);

+1

Я ценю использование карты. Спасибо за ваше время. –

1

Не переусердствуйте петли. Вы можете использовать индекс внешнего цикла как для учителей, так и для ученических массивов.

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); 
    } 
} 
+0

Отличный ответ, спасибо. –

1

хорошо, если элементы всех студентов являются массивы (2-мерный массив), то вам просто нужно добавить еще один для цикла, чтобы очистить внутренний массив

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); 
     } 
    } 
} 
1

Вы используете студентов. длина во внутреннем цикле, который должен был быть студентом [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) 
1

Loop через 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);

+0

Огромное спасибо. Ваш ответ помог понять, что происходит. –

0

Просто потому, что это возможно, вот одна линия Ответ

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

Решение с помощью Array.forEach и Array.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" 
     ] 
    } 
    ... 
] 
1

Это, кажется, простая работа карт.

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; 
             }); 
+1

Очень вдумчивый стиль отступов. –

Смежные вопросы