Modifier chaque valeur d'un tableau d'objets en fonction de la clé
cercle blanc
Supposons que j'ai deux tableaux comme ceux-ci :
const dataset = [{n: "2", s: 'hello', b: 'TRUE'}, {n: "0", s: 'meow', b: 'FALSE'}]
const info = {n:{type: 'TEXT'}, s:{type: 'PARAGRAPH'}, b:{type: 'CHECKBOX'}}
et je veux transformer dataset
en ceci:
const dataset = [{n: 2, s: 'hello', b: true}, {n: 0, s: 'meow', b: false}]
ainsi les valeurs avec clé n
deviennent des nombres, les valeurs avec clé sont s
devenues stringa et les valeurs avec clé sont b
devenues booléennes.
J'ai donc créé cette fonction pour faire correspondre le info
type et la clé :
function dataType(formType) {
switch (formType) {
case 'TEXT':
return 'number'
case 'PARAGRAPH':
return 'string'
case 'CHECKBOX':
return 'boolean'
default:
throw new Error(`Something went wrong.`)
}
}
Maintenant, j'ai besoin d'une fonction qui analyse dataset
, vérifie chaque objet et transforme toutes les valeurs. Je préfère faire une copie du jeu de données, donc immutabilité.
Je pense utiliser un reduce
mais j'ai besoin d'aide:
function dataParse(dataset, info) {
const result = dataset.map((datum) => {
return Object.entries(datum).reduce((acc, curr, i) => {
// ???
return acc
}, {})
})
return result
}
Je suppose d'utiliser un code similaire à :
let v // don't like let
switch (value) {
case 'number':
v = +response
break
case 'string':
v = response.toString()
break
case 'boolean':
v = v === 'TRUE' ? true : false
break
default:
throw new Error(`Something went wrong.`)
mais comment?
Le code complet est ici :
function dataType(formType) {
switch (formType) {
case 'TEXT':
return 'number'
case 'PARAGRAPH':
return 'string'
case 'CHECKBOX':
return 'boolean'
default:
throw new Error(`Something went wrong.`)
}
}
function dataParse(dataset, info) {
const result = dataset.map((datum) => {
return Object.entries(datum).reduce((acc, curr, i) => {
// ???
return acc
}, {})
})
return result
}
const dataset = [{n: "2", s: 'hello', b: 'TRUE'}, {n: "0", s: 'meow', b: 'FALSE'}]
const info = {n:{type: 'TEXT'}, s:{type: 'PARAGRAPH'}, b:{type: 'CHECKBOX'}}
console.log(dataParse(dataset, info))
norrois
ou quelque chose de similaire. Si vous êtes sûr que
Je ferais juste une boucle et déposerais l'objet d'information comme ça
const dataset = [{n: "2", s: 'hello', b: 'TRUE'}, {n: "0", s: 'meow', b: 'FALSE'}]
const newDataset = dataset.map((data) => {
return {n: parseInt(data.n), s: data.s, b: data.b === "TRUE" ? true : false}
})
console.log(newDataset)
n
contient toujours un nombre et b
est toujours soit "TRUE"
ou "FALSE"
, je pense que c'est la voie à suivre.
Sinon, pour continuer sur votre exemple :
function transform(data, info) {
let newObj = {};
Object.keys(data).forEach((key) => {
switch(info[key].type) {
case 'TEXT':
newObj[key] = parseInt(data[key])
break;
case 'PARAGRAPH':
newObj[key] = data[key]
break;
case 'CHECKBOX':
newObj[key] = data[key] === "TRUE" ? true : false;
break;
default:
throw new Error(`Something went wrong.`)
}
})
return newObj
}
function dataParse(dataset, info) {
const result = dataset.map((datum) => {
return transform(datum, info)
})
return result
}
const dataset = [{n: "2", s: 'hello', b: 'TRUE'}, {n: "0", s: 'meow', b: 'FALSE'}]
const info = {n:{type: 'TEXT'}, s:{type: 'PARAGRAPH'}, b:{type: 'CHECKBOX'}}
console.log(dataParse(dataset, info))