1
votes

Conversion du format de tableau multidimensionnel Javascript

J'ai un tableau qui ressemble à ceci -

myOldArray = [{
    "id": 1,
    "form_id": 4,
    "form_field_name": "field_1",
    "helperTitle": "This is Box 1's TItle",
    "helperText": "This is Box 1 data",
    "created_at": null,
    "updated_at": null
  },
  {
    "id": 2,
    "form_id": 4,
    "form_field_name": "field_2",
    "helperTitle": "Box 2 Title",
    "helperText": "Box 2 TExt",
    "created_at": null,
    "updated_at": null
  }
]
var AR = myOldArray;
var newArr = AR.filter(function(item) {
  if (item.form_field_name == fieldName) {
    console.log('txt - ' + item + '\n\n');
    return item;
  }
});

et j'ai besoin de dupliquer / copier / convertir / ... peu importe ... ce tableau en quelque chose comme ça - p >

  console.log(myNewArray.field_1.title) 

afin que je puisse le référencer par

myNewArray = {
  field_1['title'] = "This is Box 1's Title",
  field_1['text'] = "This is Box 1 data",
  field_2['title'] = "Box 2 Title",
  field_2['text'] = "Box 2 Text",
}

ou quelque chose de plus utilisable.

J'ai essayé de utilisez la méthode du filtre en vain. Tout ce que j'ai essayé revient juste indéfini. Je suis juste super confus. Y a-t-il un meilleur moyen de référencer les éléments dans le sous-tableau directement sans convertir?

Cela fonctionnait en quelque sorte ... le console.log afficherait ce que je voulais mais la valeur renvoyée serait affichée comme non définie, me déroute.

var myOldArray = [{
        "id": 1,
        "form_id": 4,
        "form_field_name": "field_1",
        "helperTitle": "This is Box 1's TItle",
        "helperText": "This is Box 1 data",
        "created_at": null,
        "updated_at": null
    },
    {
        "id": 2,
        "form_id": 4,
        "form_field_name": "field_2",
        "helperTitle": "Box 2 Title",
        "helperText": "Box 2 TExt",
        "created_at": null,
        "updated_at": null
    }
]


8 commentaires

La question publiée ne semble pas inclure aucune tentative de résoudre le problème. StackOverflow s'attend à ce que vous essayez de résoudre votre propre problème d'abord , car vos tentatives nous aident à mieux comprendre ce que vous voulez. Veuillez modifier la question pour montrer ce que vous avez essayé, afin d'illustrer un roadblock spécifique que vous rencontrez dans un exemple reproductible minimal . Pour plus d'informations, veuillez consulter Comment demander et suivre le tour .


btw, votre myNewArray doit être un objet au lieu d'un tableau, car vous utilisez des propriétés nommées au lieu de clés.


Ouais, je pensais avoir utilisé des accolades sur myNewArray, mais j'essaye de résoudre ce problème depuis 6 heures ... la fatigue est apparue ... je l'ai réparé.


Quel est le problème (ou non utilisable) avec myOldArray [0] .helperTitle ?


Je ne sais pas de quel index de tableau j'ai besoin lorsque je le produit. J'ai besoin de référencer des index spécifiques - IE, j'ai besoin de sortir helperTitle pour l'index où form_field_name = field_2 et je ne saurai pas si c'est l'index 0 ou 1, ou il peut y avoir 100 éléments dans ce tableau.


Veuillez mettre à jour l'extrait que j'ai créé pour vous avec du code HTML pertinent


@Deadlance On dirait que vous devez vraiment en apprendre un peu plus sur les structures de données dans JS.


@Ben Je travaille à apprendre autant que je peux aussi vite que possible. C'est juste un problème étrange sur lequel je suis coincé. Je ne peux pas comprendre comment obtenir des index spécifiques de tableaux multidimensionnels via une paire clé / valeur au lieu de leur index.


4 Réponses :


0
votes

Vous pouvez mapper les éléments de nouveaux objets avec les propriétés souhaitées en tant qu'objets.

Cela fonctionne avec

.as-console-wrapper { max-height: 100% !important; top: 0; }
var data = [{ id: 1, form_id: 4, form_field_name: "field_1", helperTitle: "This is Box 1's TItle", helperText: "This is Box 1 data", created_at: null, updated_at: null }, { id: 2, form_id: 4, form_field_name: "field_2", helperTitle: "Box 2 Title", helperText: "Box 2 TExt", created_at: null, updated_at: null }],
    result = Object.assign(
        ...data.map(({ id, helperTitle: title, helperText: text }) =>
            ({ ['field_' + id]: { title, text } }))
    );

console.log(result);


9 commentaires

J'ai des problèmes pour publier du code dans les commentaires, apparemment ... mais j'obtiens une erreur avec le code que vous avez fourni qui dit Impossible de convertir undefined en objet.


$ .get ('/ api / system / formHelperText / 4', function (data) {if (data) {this.helpText = data;}} .bind (this)); var X = this.helpText; console.log (X); result = Object.assign (... X.map (({id, helperTitle: title, helperText: text}) => ({['field_' + id]: {title, text}}))); console.log (résultat);


cela ressemble à un problème asynchrone, à cause du undefined voyez-vous le tableau dans le console.log? pouvez-vous prendre un élément du tableau?


@Deadlance vous n'avez pas besoin d'analyser la chaîne JSON pour objecter


dans mon code ci-dessus mal formaté, le premier console.log (X) sort effectivement le tableau dans le journal, mais le console.log (résultat) produit l'erreur


@Slai, je ne pense pas. console.log (this.helpText [0] .helperTitle); génère la chaîne appropriée. Le problème que j'ai est, je ne veux pas sortir la chaîne de [0] ... J'ai besoin d'obtenir la chaîne pour l'index où form_field_name = une chose spécifique.


comme je l'ai écrit, cela pourrait être un problème asynchrone, où vous traitez des données qui ne sont pas disponibles pour le moment.


@ninaScholz cela semble être un problème asynchrone ... Maintenant, pour comprendre comment résoudre ce problème ...


@deadlance stackoverflow.com/questions/23667086/...



0
votes

Je suppose que tout le traitement devrait être dans la fonction $ .get:

$.getJSON('/api/system/formHelperText/4', function (data) { 
    var myNewArray = data.map(function(item) {
        var obj = {};
        obj['field_' + item.id] = { Title: item.helperTitle, Text: item.helperText };
        return obj;
    });
    console.log(myNewArray);
};


0 commentaires

0
votes

Vous pouvez écrire un simple réduisez l'appel pour obtenir le résultat souhaité:

const array=[{id:1,form_id:4,form_field_name:"field_1",helperTitle:"This is Box 1's TItle",helperText:"This is Box 1 data",created_at:null,updated_at:null},{id:2,form_id:4,form_field_name:"field_2",helperTitle:"Box 2 Title",helperText:"Box 2 TExt",created_at:null,updated_at:null}]

const result= array.reduce((acc, a) => 
  (acc[a.form_field_name] = {title: a.helperTitle,text: a.helperText}, acc), {});

console.log(result);


0 commentaires

0
votes

La réponse est très simple:

const myObj = objs.get("field_1");

Et maintenant vous pouvez accéder à vos objets par le nom du champ:

const objs = new Map();

for (const obj of myOldArray) {
    objs.set(obj.form_field_name, obj);
}


0 commentaires