2017-05-03 12 views
2

フォーム要素からオブジェクトを作成しようとしています。何らかの理由で、エラーを投げています。空のオブジェクトのreduce関数が機能しません

let allInputs = [...formData]; 
allInputs.pop(); //Remove submit button 
return allInputs.reduce((userObj, data) => userObj[`${data.name}`] = data.value, {}); 

エラー

userModel.js:17 Uncaught TypeError: Cannot create property 'last_name' on string '' 
+0

「userObj」のような文字列ですか? –

+1

'reduce'コールバックはアキュムレータを返す必要があります。 – loganfsmyth

答えて

4

アキュムレータを返すか、あなたのケースでuserObjを減らすたびにコードを表示する必要があります。

allInputs.reduce((userObj, data) => (userObj[`${data.name}`] = data.value, userObj), {}); 
3

問題は、あなたがあなたの減速が呼び出された二回目、あなたが起動しない何を返しているものです。

割り当てを返しても、オブジェクトを返す必要があります。

(userObj, data) => userObj[`${data.name}`] = data.value // <-- this returns the result of the assignment 

このような何か作業をする必要があります:

allInputs.reduce(
    (userObj, data) => Object.assign(userObj, { 
    [data.name]: data.value 
    }), 
    {} 
); 

注:コメントでヴィックで述べたように、文字列の補間の必要がない、すなわち${data.name} - >ちょうどdata.nameは十分ですが。

+0

これはちょうど '$(...)'の代わりに '[data.name]:data.value'ですか? – Vic

+0

@Vicうん、それに応じて編集しました。 – nem035

+0

'Object.assign'への最初の引数として' userObj'を入れない理由はありますか?これはおそらく、元の名前と重複する名前が異なる動作をしている可能性があります。 – loganfsmyth

関連する問題