Il y a tellement de messages ici concernant la fusion des objets de tableau javaScript par rapport à ma question, la plupart d'entre eux fusionnent 2 tableaux dans mon cas, c'est différent. tags '
Voici mon code:
[ { "web_devt": [ item_id: "765558416", item_id: "765558416", item_id: "765558416", ...] }, { "react": [ item_id: "765558416", item_id: "765558416", item_id: "765558416", ...] }, { "JavaScipt": [ item_id: "765558416", item_id: "765558416", item_id: "765558416", ...] }
Voici mon résultat:
[â {â "web_devt": {â "item_id": "858850847",â "tag": "web_devt"â }â },â {â "web_devt": {â "item_id": "1004644524",â "tag": "web_devt"â }â },â {â "pdo": {â "item_id": "1056300113",â "tag": "pdo"â },â "php": {â "item_id": "1056300113",â "tag": "php"â },â "web_devt": {â "item_id": "1056300113",â "tag": "web_devt"â }â },â {â "parallax scrolling": {â "item_id": "1087678088",â "tag": "parallax scrolling"â }â },â {â "react": {â "item_id": "2435593852",â "tag": "react"â }â },â {â "javascript": {â "item_id": "2435595088",â "tag": "javascript"â }â },â {â "react": {â "item_id": "2465629468",â "tag": "react"â }â }â ]â
Je veux fusionnez-les comme ceci:
JSON.map((key) => (key.tags)) .filter(function (element) { return element !== undefined; })
]
et ainsi de suite ... Fondamentalement, toutes les mêmes balises fusionneront Comment faites-vous cela dans la réduction ou n'importe quelle solution mais pas avec loadash ou avec un tiers?
3 Réponses :
En supposant que les tableaux internes sont censés contenir des objets, utilisez .reduce
pour regrouper les objets d'entrée dans un objet indexé par item_id
, puis transformez cet objet en un tableau en utilisant Object.entries
:
const input = [â{â "web_devt": {â "item_id": "858850847", "tag": "web_devt"â }â }, â {â "web_devt": {â "item_id": "1004644524", "tag": "web_devt"â }â }, â {â "pdo": {â "item_id": "1056300113", "tag": "pdo"â }, â "php": {â "item_id": "1056300113", "tag": "php"â }, â "web_devt": {â "item_id": "1056300113", "tag": "web_devt"â }â }, â {â "parallax scrolling": {â "item_id": "1087678088", "tag": "parallax scrolling"â }â }, â {â "react": {â "item_id": "2435593852", "tag": "react"â }â }, â {â "javascript": {â "item_id": "2435595088", "tag": "javascript"â }â }, â {â "react": {â "item_id": "2465629468", "tag": "react"â }â }â ]; const outputObj = input.reduce((a, outerObj) => { Object.entries(outerObj).forEach(([key, { item_id }]) => { if (!a[key]) a[key] = []; a[key].push({ item_id }); }); return a; }, {}); const output = Object.entries(outputObj).map(([key, arr]) => ({ [key]: arr })); console.log(output);
Désolé pour mon ignorance, pourquoi utiliser Object.entries et non Object.values? C'est parce que Object.entries (obj) - renvoie un tableau de paires [clé, valeur]. et Object.values (obj) - renvoie un tableau de valeurs que nous pouvons renvoyer la clé et la valeur ici, non?
Bien sûr, vous pouvez utiliser l'un ou l'autre, c'est à vous de décider. Si le nom de la clé est différent de la balise
et que vous voulez la balise, utilisez à la place Object.values
.
La syntaxe de sortie souhaitée n'est pas valide. Vous ne pouvez pas avoir de tableau avec des clés ni un objet avec plusieurs clés du même nom.
Cependant, si vous voulez avoir un tableau d'id, vous pouvez utiliser réduire et regrouper les données et pour l'élément individuel utiliser Object.entries
a> pour obtenir la clé et la valeur dans l'objet.
var data = [â {â "web_devt": {â "item_id": "858850847",â "tag": "web_devt"â }â },â {â "web_devt": {â "item_id": "1004644524",â "tag": "web_devt"â }â },â {â "pdo": {â "item_id": "1056300113",â "tag": "pdo"â },â "php": {â "item_id": "1056300113",â "tag": "php"â },â "web_devt": {â "item_id": "1056300113",â "tag": "web_devt"â }â },â {â "parallax scrolling": {â "item_id": "1087678088",â "tag": "parallax scrolling"â }â },â {â "react": {â "item_id": "2435593852",â "tag": "react"â }â },â {â "javascript": {â "item_id": "2435595088",â "tag": "javascript"â }â },â {â "react": {â "item_id": "2465629468",â "tag": "react"â }â }â ]â const res = data.reduce((acc, item) => { Object.entries(item).forEach((attr) => { const [key,value] = attr; if(value.tag !== undefined) { if (acc[key]){ acc[key].push(value.item_id); } else { acc[key] = [value.item_id]; } } }); return acc; }, {}) console.log(res);
Voici mon essai en utilisant Array.reduce ()
avec un Object.values ()
imbriqué et Array.forEach ()
:
.as-console {background-color:black !important; color:lime;} .as-console-wrapper{max-height:100% !important; top:0}
const input = [â {â "web_devt": {"item_id": "858850847",â"tag": "web_devt"}â },â {â "web_devt": {"item_id": "1004644524",â"tag": "web_devt"}â },â {â "pdo": {"item_id": "1056300113", "tag": "pdo"},â "php": {"item_id": "1056300113",â"tag": "php"},â "web_devt": {"item_id": "1056300113",â"tag": "web_devt"}â },â {â "parallax scrolling": {"item_id": "1087678088",â"tag": "parallax scrolling"}â },â {â "react": {â"item_id": "2435593852", "tag": "react"}â },â {â "javascript": {"item_id": "2435595088",â"tag": "javascript"}â },â {â "react": {"item_id": "2465629468", "tag": "react"}â }â ]; let res = input.reduce((acc, obj) => { Object.values(obj).forEach(({item_id, tag}) => { acc[tag] = acc[tag] || {[tag]:[]} acc[tag][tag].push(item_id); }); return acc; }, {}); console.log(Object.values(res));
Merci pour votre réponse à ma question. J'ai essayé et ça marche.
@ GLEN87 Je suis heureux d'aider, n'oubliez pas de voter pour les réponses qui vous aident et d'accepter l'une des réponses.
La syntaxe de la sortie souhaitée n'est pas valide. Les tableaux n'ont pas de paires clé-valeur, uniquement des valeurs.
@Shidersz, la deuxième suggestion que vous avez est également invalide car vous ne pouvez pas avoir plusieurs clés du même nom dans un objet
@ShubhamKhatri Vous avez raison, j'aimerais pouvoir encore modifier mon commentaire, mais je devrai supprimer à la place ...
@Shidersz Vous pouvez supprimer et ajouter la partie appropriée