2017-09-04 1 views
0

Je suis coincé au problème suivant:Comment fusionner deux éléments avant de les JSON dans l'analyse syntaxique

J'ai créé une forme dont l'entrée se JSON à parsé me montré (plus tard ça va . transmettre) maintenant la sortie de chaque champ de saisie obtient dans un élément séparé, voir:

{ 
    "hash": "", 
    "serviceVersion": "0.5", 
    "subject": "yadayada", 
    "organisator": "dinitante", 
    "roomstyle": [ 
    "kno" 
    "da" 
    ] 
} 

l'objectif est de combiner « organisator » et « roomstyle » à « addednote », et remplacer les deux dans la sortie. J'ai essayé différentes choses mais n'a pas pu le faire fonctionner, cela semble fonctionner, mais je ne sais pas où commencer avec la modification de la sortie:

function join_note() 
{ 
var organisator = document.getElementById('organisator').value; 
var roomstyle = document.getElementById('roomstyle').value; 
document.getElementById('jointnote').value = roomstyle+organisator; 
alert(document.getElementById('jointnote').value); 
} 

C'est la qui prend l'entrée js (Babel) et affiche la sortie dans JSON:

const isValidElement = element => { 
    return element.name && element.value; 
}; 


const isValidValue = element => { 
    return (!['checkbox', 'radio'].includes(element.type) || element.checked); 
}; 


const isCheckbox = element => element.type === 'checkbox'; 
const isMultiSelect = element => element.options && element.multiple; 


const getSelectValues = options => [].reduce.call(options, (values, option) => { 
    return option.selected ? values.concat(option.value) : values; 
}, []); 

const formToJSON_deconstructed = elements => { 
    const reducerFunction = (data, element) => { 
    data[element.name] = element.value; 
    console.log(JSON.stringify(data)); 
    return data; 
    }; 
    const reducerInitialValue = {}; 
    console.log('Initial `data` value:', JSON.stringify(reducerInitialValue)); 
    const formData = [].reduce.call(elements, reducerFunction, reducerInitialValue); 
    return formData; 
}; 
const formToJSON = elements => [].reduce.call(elements, (data, element) => { 
    if (isValidElement(element) && isValidValue(element)) { 
    if (isCheckbox(element)) { 
     data[element.name] = (data[element.name] || []).concat(element.value); 
    } else if (isMultiSelect(element)) { 
     data[element.name] = getSelectValues(element); 
    } else { 
     data[element.name] = element.value; 
    } 
    } 

    return data; 
}, {}); 
const handleFormSubmit = event => { 
    event.preventDefault(); 
    const data = formToJSON(form.elements); 
    const dataContainer = document.getElementsByClassName('results__display')[0]; 
    dataContainer.textContent = JSON.stringify(data, null, " "); 
}; 
const form = document.getElementsByClassName('contact-form')[0]; 
form.addEventListener('submit', handleFormSubmit); 
+1

Vous pouvez créer un [mcve] en utilisant la JS et le code HTML généré – mplungjan

+0

[exemple Codepen] (https://codepen.io/sprunge1/pen/qXvMmd) – Chris

+1

Cliquez sur le <<> 'et vous pouvez le poster ici – mplungjan

Répondre

1

Vous pouvez capturer les données de formulaire juste avant leur envoi et manipuler le fichier json.

const json = { 
    "hash": "", 
    "serviceVersion": "0.5", 
    "subject": "yadayada", 
    "organisator": "dinitante", 
    "roomstyle": [ 
    "kno" 
    "da" 
    ] 
}; 

json.addednote = [ 
    ...json.organisator, 
    ...json.roomstyle, 
]; 

delete json.organisator; 
delete json.roomstyle; 

// You have a ready json object 

Sans l'opérateur de diffusion:

json.addednote = [ 
    json.organisator, 
]; 

json.roomstyle.forEach(x => (json.addednote.push(x)));