Construire un tableau imbriqué fusionné sur une valeur du tableau parent

Décrivez le problème/l’erreur/la question

J’ai besoin de fusionner un tableau imbriqué en fonction des valeurs d’une clé parent.

Quel est le message d’erreur (le cas échéant) ?

Veuillez partager votre flux de travail

Données - recevoir les données dans ce format, où la ref est dupliquée sur plusieurs éléments, chacun avec un objet imbriqué. J'ai besoin d'une seule instance :
[
  {
    "ref": "00075925",
    "Items": [
      {
        "ID": 1
      }
    ]
  },
  {
    "ref": "00075925",
    "Items": [
      {
        "ID": 2
      }
    ]
  },
  {
    "ref": "00075925",
    "Items": [
      {
        "ID": 3
      }
    ]
  },
  {
    "ref": "00075926",
    "Items": [
      {
        "ID": 1
      }
    ]
  },
  {
    "ref": "00075926",
    "Items": [
      {
        "ID": 2
      }
    ]
  },
  {
    "ref": "00075926",
    "Items": [
      {
        "ID": 3
      }
    ]
  }
]


Le résultat devrait être :
[
  {
    "ref": "00075925",
    "Items": [
      {
        "ID": 1
      },
      {
        "ID": 2
      },
      {
        "ID": 3
      }
    ]
  },
  {
    "ref": "00075926",
    "Items": [
      {
        "ID": 1
      },
      {
        "ID": 2
      },
      {
        "ID": 3
      }
    ]
  }
]

Partagez la sortie renvoyée par le dernier nœud

J’ai besoin que la sortie ressemble à l’exemple ci-dessus, où les éléments sont fusionnés sur la ref, et le tableau d’objets imbriqués est construit à partir de l’entrée, mais je n’arrive pas à obtenir le JSON correct.

Informations sur votre configuration n8n

  • Version n8n : En ligne
  • Base de données (par défaut : SQLite) :
  • Paramètre EXECUTIONS_PROCESS de n8n (par défaut : own, main) :
  • Exécution de n8n via le cloud n8n
  • Système d’exploitation :

Salut @Quiss, en attendant une réponse, voici quelques ressources qui pourraient t’aider :

Ressources suggérées

Automatiquement adaptées à ta question.

Documentation :

Forum :

@Sven_Wesley, @DmitryMigunov, @Niffzy - vous avez déjà aidé sur des problèmes similaires, vous pouvez y jeter un œil ?

Suggéré automatiquement par le bot communautaire de n8n. C’est un projet pilote - partage tes retours ici.

Bonjour @Quiss Bienvenue !
Résumez les groupes sur un champ comme le ferait un tableau croisé dynamique, et son agrégation Append collecte un autre champ pour chaque groupe.

  1. Résumé : définissez Champs à diviser par sur ref, ajoutez une agrégation Append sur le champ Items, et définissez le format de sortie sur « Chaque division dans un élément séparé ».
  2. Modifier les champs : ajoutez ref en tant que String défini sur {{ $json.ref }} et Items en tant que Array défini sur {{ $json.appended_Items.reduce((all, one) => all.concat(one), []) }}.
    Append nomme sa sortie appended_Items et conserve chaque tableau source intact, donc le reduce les concatène dans un seul tableau Items.
    Summarize | Nodes | n8n Docs

Salut @Quiss

Le moyen le plus simple de gérer cela dans n8n serait d’utiliser un nœud Code. Puisque ref est la valeur selon laquelle vous voulez grouper, vous pouvez parcourir les éléments entrants et collecter tous les Items imbriqués sous la même ref. const grouped = {};

for (const item of $input.all()) {
const { ref, Items = } = item.json;

if (!grouped[ref]) {
grouped[ref] = {
ref,
Items:
};
}

grouped[ref].Items.push(…Items);
}

return Object.values(grouped).map(item => ({
json: item
}));

Le code parcourt chaque élément, vérifie sa valeur de ref et détermine si cette ref a déjà été regroupée.

Si ce n’est pas le cas, il crée un nouveau groupe. Si c’est le cas, il ajoute simplement les nouveaux Items au tableau existant.

Ainsi, tous les enregistrements 00075925 deviennent un objet, et tous les enregistrements 00075926 deviennent un autre.

Cela fonctionne également si vous avez beaucoup plus d’enregistrements ou si le nombre d’Items change, il n’est donc pas nécessaire de coder en dur les ID ou le nombre d’éléments.