2017-05-03 7 views
2

Ich versuche, ein Objekt aus Formularelementen zu erstellen. Aus irgendeinem Grund wirft es den Fehler auf.reduzieren Funktion mit leeres Objekt funktioniert nicht

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

Fehler

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

Scheint wie 'userObj' ist eine Zeichenfolge? –

+1

'reduce' Callbacks müssen den Akku zurückgeben. – loganfsmyth

Antwort

4

Sie müssen Akkumulator oder in Ihrem Fall userObj in jeder Iteration reduzieren, damit Ihr Code so aussehen sollte.

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

Das Problem ist, was Sie zum zweiten Mal Ihre Minderer genannt werden zurückkehren wird, nicht das, was Sie beginnen mit.

Sie geben eine Zuweisung zurück, sollten aber ein Objekt zurückgeben.

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

So etwas wie dies funktionieren soll:

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

Hinweis: wie von Vic im Kommentar erwähnt, keine Notwendigkeit für String-Interpolation, das heißt ${data.name} -> nur data.name ist genug.

+0

kann dies einfach sein: '[data.name]: data.value' anstelle von' $ (...) '? – Vic

+0

@Vic yup, habe ich entsprechend bearbeitet. – nem035

+0

Gibt es einen Grund, 'userObj' nicht als erstes arg in' Object.assign' zu setzen? Dies hat wahrscheinlich auch ein anderes Verhalten als das Original für doppelte Namen. – loganfsmyth