0
votes

regrouper les données json par colonnes

j'ai un tableau json

var arr3=["EMAIL", "LASTNAME", "FIRSTNAME", "SMS"];

let arr_email=[];

arr.forEach(function(e, i) {

    arr_email.push(arr[i]['EMAIL']) 
})

var arr2=[];

arr2.push({"EMAIL":arr_email});

je veux une sortie comme

EMAIL : {"john@example.com","harry@example.com","howard@example.com"}
LASTNAME={"Smith", "Pierce","Paige"}

j'ai essayé beaucoup de choses, j'ai trouvé une solution avec hardcore nom de la colonne

let arr = [
  { EMAIL: 'john@example.com', LASTNAME: 'Smith', FIRSTNAME: 'John', SMS: '33123456789' },
  { EMAIL: 'harry@example.com', LASTNAME: 'Pierce', FIRSTNAME: 'Harry', SMS: '33111222222' },
  { EMAIL: 'howard@example.com', LASTNAME: 'Paige', FIRSTNAME: 'Howard', SMS: '33777888898' },
];

Mais je recherche une solution générique. Je ne veux pas passer le nom de la colonne hardcore. veuillez suggérer


0 commentaires

7 Réponses :


4
votes

Mise à jour: correction du nom et de l'initialisation pour que tout soit cohérent.

Utilisez quelque chose comme ceci:

EMAIL: (3) ["john@example.com", "harry@example.com", "howard@example.com"]
FIRSTNAME: (3) ["John", "Harry", "Howard"]
LASTNAME: (3) ["Smith", "Pierce", "Paige"]
SMS: (3) ["33123456789", "33111222222", "33777888898"]

Vous aurez donc dans:

console.log(newObject)

Quelque chose comme:

let arr=[{EMAIL: "john@example.com", LASTNAME: "Smith", FIRSTNAME: "John", SMS: "33123456789"}
    ,{EMAIL: "harry@example.com", LASTNAME: "Pierce", FIRSTNAME: "Harry", SMS: "33111222222"}
    ,{EMAIL: "howard@example.com", LASTNAME: "Paige", FIRSTNAME: "Howard", SMS: "33777888898"}]
let newObject = {}

arr.forEach(element => {
  Object.keys(element).forEach(key => { 
  if(!newObject[key]) {
    newObject[key] = []
  }
  newObject[key].push(element[key]) 
  })
})


4 commentaires

Une autre question, je veux extraire le nom de la colonne aussi comme un email .. Que puis-je essayer?


Se briserait si tous les éléments du tableau n'avaient pas exactement les mêmes propriétés .


@NeerajVerma nom de colonne c'est une clé de chaîne de votre objet. Désolé, j'ai fait une erreur de nommage, newArr n'est pas un tableau, c'est un objet. Je l'ai changé.


@HMR ce n'est pas lié à ma réponse.



0
votes

Vous pouvez utiliser Destructuration de l'affectation Avec carte Array et réduire:

p>

const arr = [
  //missing sms
  {EMAIL: 'john@example.com',LASTNAME: 'Smith',FIRSTNAME: 'John'},
  //missing last name
  {EMAIL: 'harry@example.com',FIRSTNAME: 'Harry',SMS: '33111222222',},
  {EMAIL: 'howard@example.com',LASTNAME: 'Paige',FIRSTNAME: 'Howard',SMS: '33777888898',},
];
//get unique keys of all items in array
const keys = [
  ...arr
    .reduce(
      (result, item) =>
        Object.keys(item).reduce(
          (result, key) => result.add(key),
          result
        ),

      new Set()
    )
    .values(),
];
const map = arr.reduce(
  (result, item) =>
    keys.reduce(
      (result, key) =>
        result.set(
          key,
          (result.get(key) || []).concat(item[key])
        ),
      result
    ),
  new Map()
);
console.log(Object.fromEntries(map.entries()) );


0 commentaires

0
votes

Faites attention que {"john@example.com", "harry@example.com", "howard@example.com"} ce n'est pas un objet valide en javascript.

Vous vouliez créer un tableau, vous pouvez utiliser Array.reduce & Object.keys afin de le regrouper.

const arr = [{
    EMAIL: 'john@example.com',
    LASTNAME: 'Smith',
    FIRSTNAME: 'John',
    SMS: '33123456789'
  },
  {
    EMAIL: 'harry@example.com',
    LASTNAME: 'Pierce',
    FIRSTNAME: 'Harry',
    SMS: '33111222222'
  },
  {
    EMAIL: 'howard@example.com',
    LASTNAME: 'Paige',
    FIRSTNAME: 'Howard',
    SMS: '33777888898'
  },
];

const result = arr.reduce((res, current) => {
  Object.keys(current).forEach(key => {
    res[key] = res[key] || [];
    res[key].push(current[key]);
  })
  return res;
}, {});

console.log(result);


3 commentaires

Casserait si tous les articles de tableau ont exactement les mêmes propriétés .


Il ne cassera pas, il contiendra undefined dans des endroits "vides".


Ce n'est peut-être qu'un cas limite, mais disons que les données proviennent d'un serveur, alors JSON.stringify ({hi: undefined}) sera {} . Il suffit de mettre le commentaire car cette question est une réponse bombardée de réponses qui ont un cas de rupture. OP ne connaîtra peut-être jamais cela, mais d'autres personnes utilisant les réponses peuvent avoir ce cas de pointe.



1
votes

Vous pouvez parcourir les clés de l'objet et pousser leurs éléments en fonction de la clé. Cela peut être fait en utilisant la méthode reduction , puis vous pouvez utiliser l'opérateur destruct . Laissez-moi vous montrer un exemple:

const arr=[
   {EMAIL: "john@example.com", LASTNAME: "Smith", FIRSTNAME: "John", SMS: "33123456789"},
   {EMAIL: "harry@example.com", LASTNAME: "Pierce", FIRSTNAME: "Harry", SMS: "33111222222"},
   {EMAIL: "howard@example.com", LASTNAME: "Paige", FIRSTNAME: "Howard", SMS: "33777888898"}
]

const allKeysWithData = arr.reduce((a, c) => {
  for (const name in c){
      a[name] = a[name] || [];
      a[name].push(c[name]);
  }
  return a;
}, {});

const { FIRSTNAME, SMS, ...result} = allKeysWithData;
console.log(result)


6 commentaires

Se briserait si tous les éléments du tableau n'avaient pas exactement les mêmes propriétés .


@HMR Je suis désolé. Je ne peux pas comprendre ce que vous voulez dire. Pourriez-vous clarifier, s'il vous plaît?


J'ai mis un lien là-bas, essayez votre code avec arr du deuxième exemple. (par exemple, si le deuxième élément du tableau a un SMS manquant)


@HMR merci pour la clarification. J'ai essayé de supprimer la propriété SMS du deuxième élément et cela fonctionne.


Essayez de supprimer un e-mail d'un élément, vous vous retrouvez avec un e-mail contenant 2 éléments et le nom de famille ayant 3 éléments. Vous ne savez maintenant pas quel nom n'a pas d'e-mail.


@HMR à mon avis, OP a simplement demandé d'obtenir le résultat souhaité sans codage en dur. Il n'y a aucun objectif de recréer une connexion entre le nom et l'e-mail. Au moins, cet objectif ne peut pas être vu à partir de la question du PO.



1
votes

Vous pouvez utiliser Object.keys pour obtenir une colonne dynamique comme celle-ci:

let arr=[{EMAIL: "john@example.com", LASTNAME: "Smith", FIRSTNAME: "John", SMS: "33123456789"}
        ,{EMAIL: "harry@example.com", LASTNAME: "Pierce", FIRSTNAME: "Harry", SMS: "33111222222"}
        ,{EMAIL: "howard@example.com", LASTNAME: "Paige", FIRSTNAME: "Howard", SMS: "33777888898"}]
const keys = Object.keys(arr[0])

const result = {};
arr.forEach(item => {
  keys.forEach(key => {
    if (!result[key]) {
      result[key] = [item[key]]
    } else {
      result[key].push(item[key])
    }
  })
})
console.log('result:', result)


2 commentaires

une autre question, je veux extraire le nom de la colonne aussi comme l'email .. que puis-je essayer?


Se briserait si tous les éléments du tableau n'avaient pas exactement les mêmes propriétés .



1
votes
let arr = [
  { EMAIL: 'john@example.com', LASTNAME: 'Smith', FIRSTNAME: 'John', SMS: '33123456789' },
  { EMAIL: 'harry@example.com', LASTNAME: 'Pierce', FIRSTNAME: 'Harry', SMS: '33111222222' },
  { EMAIL: 'howard@example.com', LASTNAME: 'Paige', FIRSTNAME: 'Howard', SMS: '33777888898' },
];


var obj = {};
for(let i = 0; i < arr.length; i++) {
    for (let [key, value] of Object.entries(arr[i])) {
       obj[key] = (obj[key] || []);
        obj[key].push(value); 
   }
}
console.log(obj)
let {EMAIL, LASTNAME} = obj;

1 commentaires

Se briserait si tous les éléments du tableau n'avaient pas exactement les mêmes propriétés .



0
votes

Vous pouvez utiliser la fonction map pour obtenir la sortie souhaitée

var keys = Object.keys(this.arr[0])

        var result = keys.map(key => {
          return { key: this.arr.map(s => s[key]) }
        })


1 commentaires

Casserait si tous les articles de tableau ont exactement les mêmes propriétés .