2016-07-13 1 views
0

が、私は私のvaluesオブジェクト配列にオブジェクトを押すと例外TypeError

values = { 
    'student': [{ 
     'field': 'prefix', 
     'description': 'First name' 
    }, { 
     'field': 'suffix', 
     'description': 'Last name' 
    }, { 
     'field': 'student_email', 
     'description': 'Email address' 
    }], 
    'classes': [{ 
     'field': 'course_code', 
     'description': 'Course code' 
    }] 
} 

を持っていると私は、「学生」と「クラス」内の各オブジェクトを取得しようとしている原因となります。つかまえたら、私はこのような新しいオブジェクトを作成しようとしています。

{type:'student', field:'prefix', description:'First Name', key:'school'} 

このオブジェクトを新しい配列にプッシュします。これは私がこれまでに...

const array = []; 

for(const v in values) { 
    array.concat(values[v].map(obj => { 
     console.log(obj); // grabs each obj successfully 
     array.push({ 
      type: v, 
      description: obj.description, 
      field: obj.field, 
      key: 'school' 
     }); 
    }); 
} 

は今のがTypeError: Cannot read property 'split' of undefinedを投げ持っているものです。私は間違って何をしていますか? .map()の内部に新しいオブジェクトを作成することはできますか?

+1

は 'values'は明確に持っている***オブジェクト***、あるなし' Array.concat() 'メソッド – adeneo

+4

あなたが投稿したコードで "スプリット" への参照はありません;エラーがどこから来たのかはわかりません。 – Pointy

+0

@Pointy lolは私のコードでは 'split'への参照は全くありません。 :\ – Modelesq

答えて

2

この試してみてください。これはあなたがしようとしたものとはかなり異なっているが、それは動作します

var out = Object.keys(values).map((type) => 
    values[type].map((item) => ({ 
    name: type, 
    field: item.field, 
    descriptiom: item.description, 
    key: 'school' 
    }) 
}).reduce((l, r) => l.concat(r)); 
+0

これはキーのマップの代わりに、reduce関数を直接使用することができます。) –

+0

whoap .. .map()の内部には.map()があります。あなたが避けたいものではありませんか? – Modelesq

+0

@Modelesqどうしてですか?これは基本的にネストされたループと同じです。あなたが別のソウルティションに移動するための非常に正当な理由がない限り、これはおそらく最も読みやすく保守的なものでしょう。 – Timo

0

var values = {'student':[{'field':'prefix','description':'Firstname'},{'field':'suffix','description':'Lastname'},{'field':'student_email','description':'Emailaddress'}],'classes':[{'field':'course_code','description':'Coursecode'}]}; 
 

 
var out = Object.keys(values).map(function(type) { 
 
    return values[type].map(function(item) { 
 
    return { 
 
     name: type, 
 
     field: item.field, 
 
     descriptiom: item.description, 
 
     key: 'school' 
 
    }; 
 
    }); 
 
}).reduce(function(l, r) { 
 
    return l.concat(r); 
 
}); 
 

 
console.log(out);


それとも、そんなによりよいES6 arrow functionsとし:

var newValues = []; 

for(t in values) { 
    for(s in values[t]) { 
     var obj = {}; 
     obj.type = t; 
     obj.field = values[t][s].field; 
     obj.description = values[t][s].description; 
     console.log(obj); 
     newValues.push(obj); 
    } 
} 

console.log(newValues); 

オブジェクトを繰り返し処理するだけです。

Codepen:http://codepen.io/theblindprophet/pen/RRjOaX

0

TimoStaが言ったようにあなたがそれを行うことができますが、減らすとの最初のマップを置き換える:

var values = {'student':[{'field':'prefix','description':'Firstname'},{'field':'suffix','description':'Lastname'},{'field':'student_email','description':'Emailaddress'}],'classes':[{'field':'course_code','description':'Coursecode'}]}; 
 

 
var out = Object.keys(values).reduce(function(previous, type) { 
 
    return previous.concat(values[type].map(function(item) { 
 
    return { 
 
     name: type, 
 
     field: item.field, 
 
     descriptiom: item.description, 
 
     key: 'school' 
 
    }; 
 
    })); 
 
}, []); 
 

 
console.log(out);

が、それはあなたが使用することができ

0

Array#reduceを役に立てば幸いすべてのオブジェクトを取得するためのArray#mapアレイ。

var values = { 'student': [{ 'field': 'prefix', 'description': 'First name' }, { 'field': 'suffix', 'description': 'Last name' }, { 'field': 'student_email', 'description': 'Email address' }], 'classes': [{ 'field': 'course_code', 'description': 'Course code' }] }, 
 
    array = Object.keys(values).reduce((r, k) => 
 
     r.concat(values[k].map(a => 
 
      ({ type: k, field: a.field, description: a.description, key: 'school' }))), []); 
 

 
console.log(array);

関連する問題