2016-06-20 14 views
2

これは私が持っているものです。オブジェクトの1つの配列:オブジェクトの別の配列のプロパティを別のオブジェクトの配列に取得する方法

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]などである。

私はフルネームプロパティを取るために何をしようとしていたのですか?各学生の「学生」は、「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; 
    } 

ヒントは歓迎します。

+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

をこすりするループのための1つ以上を追加する必要があります。配列の配列であるため、students [j] .lengthだったはずのinner forループの長さ。 teachers

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

ループオブジェクトをコピーします。配列としてSundayStudentsを追加します。Array.forEachを使用して

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

それが可能だという理由だけで、ここでは1行の答えだ

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

解決策:対応するインデックスとプッシュSundayStudentsからFullNamestudentsループスルーおよび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と互換性のあるバージョンを提供しましょう。

+1

非常にファンキーなインデントスタイル。 –

関連する問題