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 dataseten ceci:

const dataset = [{n: 2, s: 'hello', b: true}, {n: 0, s: 'meow', b: false}]

ainsi les valeurs avec clé ndeviennent des nombres, les valeurs avec clé sont sdevenues stringa et les valeurs avec clé sont bdevenues booléennes.

J'ai donc créé cette fonction pour faire correspondre le infotype 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 reducemais 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

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)
ou quelque chose de similaire. Si vous êtes sûr que 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))

Articles connexes