0
votes

Diviser chaque élément dans la matrice en objet après un certain caractère

Je suis nouveau à node.js et javascript. J'ai le tableau suivant:

[{
  name: 'name1',
  street: 'street2',
  person: 'person1',
  phone1: 'phone82 ',
  phone2: 'phone3'
},
{
  name: 'name2',
  street: 'street2',
  person: 'person1',
  phone1: 'phone1 ',
  phone2: 'phone2'
}]


6 commentaires

Il n'y a qu'un seul élément dans le tableau d'origine, vous rendez-vous compte que?


Correct, c'est un seul élément.


Typo, mon mauvais. @ Sven.hig


Que signifie "après chaque première"? Parce que JS sait Il n'y a aucun symbole + , il n'y a que les caractères de votre chaîne. Voulez-vous dire "après chaque nouvelle ligne"?


@ Mike'pomax'kamermans vous avez raison. J'ai fait un autre typo, désolé.


Alors qu'avez-vous réellement essayé? Parce que cela ressemble à une norme "Split sur \ n , puis pour chacun de ceux-ci, scindé sur \ t ", qui est un code difficilement difficile?


3 Réponses :


2
votes

Si vous avez la même structure pour tous les éléments de old_array code>, vous pouvez utiliser mapper code>, filtre code> et Réduire code> Afin de manipuler votre contribution.

alors ce que j'ai fait? p>

  1. Si vous avez plusieurs chaînes telles que l'exemple d'entrée (plus d'un élément de tableau), je le converties en sous-tableaux de chaque chaîne à l'aide de mapper code> et divisé code> par \ n code>, quel est votre séparateur de chaîne. Que je l'ai filtré par des chaînes qui ne sont pas vides (car vous avez une option post-correction de \ n code> aussi). Li>
  2. à partir de chaque sous-tableau, j'ai extrait tous les contacts à l'aide de ExtractContacts CODE> Fonction - Il splite la sous-tableau par votre SEPARAOTR, \ t code> et mappez-le en fonction de votre Contacts Temaplte. Li>
  3. Comme il s'agit d'un format de matrice de tableaux, j'ai utilisé réduire pour concéder tous les tableaux ensemble li> ol>

    p>

    const OLD_ARRAY = [
      'name1\tstreet\tperson\tphone1\tphone2\n' +
      'name2\tstreet2\tperson1\tphone82\tphone3\n'
    ];
    
    function extractContacts(templates) {
      return templates.map(t => t.split('\t'))
        .map(details => ({
          name: details[0],
          street: details[1],
          person: details[2],
          phone1: details[3],
          phone2: details[4]
        }));
    }
    
    let contacts = OLD_ARRAY.map(str => str.split('\n').filter(str => str !== ''))
      .map(template => extractContacts(template))
      .reduce((a, acc) => acc.concat(a), []);
    
    console.log(contacts)


4 commentaires

Remarquez qu'il n'y a pas deux éléments dans le tableau d'origine si vous lisez la question avec soin


@Patrickroberts Je pense que l'OP avait une faute de frappe, et même s'il ne le faisait pas, il ne fait que changer le + sur , pour obtenir le format de type tableau


Il est possible que la seule sortie intermédiaire après analyse JSON à partir d'une requête HTTP, par exemple, et que l'OP n'a aucun contrôle sur le format de l'entrée. Vous ne pouvez pas supposer que cela est trivialement possible de modifier le format d'entrée, car la question pourrait simplifier beaucoup de choses pour isoler la partie dont ils ont besoin d'aide.


@Patrickroberts Vous avez raison, j'ai corrigé ma réponse en conséquence



1
votes

Vous pouvez diviser chaque oldarray code> sur \ n code>, puis \ t code> dans Newarray code>, puis utilisez ensuite objet.fromentries code> pour créer un objet à partir de chaque valeur Newarray code>, combinant les valeurs divisées avec chaque clé de en-têtes code>:

p>

var oldarray = [
  'name1\tstreet\tperson\tphone1\tphone2\n' +
  'name2\tstreet2\tperson1\tphone82\tphone3\n'
]

let newarray = [];

oldarray.forEach(s => s.trim().split('\n').map(v => newarray.push(v.split('\t'))));

let headers = {
  'name': "",
  'street': "",
  'person': "",
  'phone 1': "",
  'phone 2': ""
}

let keys = Object.keys(headers);

out = newarray.map(s => Object.fromEntries(s.map((v, i) => [keys[i], v])));
console.log(out);


1 commentaires

Il n'y a pas deux éléments dans le tableau d'origine si vous lisez attentivement la question ...



0
votes

First Split the tableau par \ n code> Pour obtenir des chemins individuels, puis diviser par \ t code> et utilisez réduire code> pour créer une nouvelle en-tête Objets de chaque banane

p>

var oldarray = [
  'name1\tstreet\tperson\tphone1\tphone2\n' +
    'name2\tstreet2\tperson1\tphone82\tphone3\n' +
    'name4\tstreet4\tperson4\tphone84\tphone4\n'
]
arr = oldarray.flatMap(o => o.split("\n"))
c = arr.map(o => o.split("\t"))
c.pop()
result = c.reduce((acc,[name, street, person, phone1, phone2],i) => {
   acc = [...acc,{name:name,street:street,person:person,phone1:phone1,phone2:phone2}]
           return acc
},[])
console.log(result)


0 commentaires