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
7 Réponses :
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])
})
})
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.
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()) ); 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);
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.
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)
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.
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)
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 .
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;
Se briserait si tous les éléments du tableau n'avaient pas exactement les mêmes propriétés .
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]) }
})
Casserait si tous les articles de tableau ont exactement les mêmes propriétés .