0
votes

Filtrer la matrice JSON imbriquée dans JavaScript et renvoyant une matrice intérieure qui correspond à un critère

J'ai un objet JSON comme celui-ci: xxx pré>

Comme vous pouvez le constater, Produits code> est un tableau contenant un autre tableau SKU code> qui contient un autre tableau attributs code>. p>

Je veux obtenir tous ces skus qui ont strong> les attributs - taille code> et couleur code> pour eux. p>

Donc, il devrait renvoyer P>

skus 001_1, 001_2 et 002_1 code> p> blockQuote>

Donc, j'ai écrit le code suivant: P>

var obj = JSON.parse('<MyAboveJSONObjectHere>');
obj.products.filter( p => p.SKUs.filter(sku => sku.Attributes.filter(att => 
att.identifier === 'Color' && att.identifier === 'Size')))


4 commentaires

att.identifier === 'couleur' ​​&& att.identifier === 'Taille' Une propriété ne peut pas contenir deux valeurs différentes à la fois


Essayez att.identifier === 'couleur' ​​|| att.identifier === 'Taille'


Puisque votre structure semble standard, vous pouvez accéder à 1 et 2 index pour vérifier si couleur et taille est disponible ou non


N'est-ce pas Att.Value == 'couleur' ​​&& att.value == 'Taille'?


4 Réponses :


0
votes
obj.products.map( p => {
       return p.SKUs.map(sku => {
    return sku.Attributes.filter(att => att.identifier === 'Color' && att.identifier === 'Size')}}
Try this, basically you need to first map through the arrays and only on the last one filter

0 commentaires

1
votes

Si je comprends correctement, vous souhaitez obtenir une liste de valeurs d'identifiant code> ID code> à partir des produits code> Produits CODE> TRÊT où ces éléments SKU ont attribut code > Sous-tableaux qui contenaient des valeurs de "couleur" code> et "taille" code>.

Ceci peut être atteint via un Réduire () CODE>, où les filtres de rappel de réduction Filter des éléments SKU basés sur les critères d'attributs. Tous les éléments SKU filtrés sont ensuite mappés sur leur champ ID code> et collectés (via concat () code>) dans le tableau de sortie résultant code> comme indiqué ci-dessous: p>

p>

const obj={"products":[{"ID":"001","Attributes":[{"value":"BESTSELLERS","identifier":"BEST_SELLER"},{"value":"Color","identifier":"Green"},{"value":"Size","identifier":"L"}],"SKUs":[{"ID":"001_1","Attributes":[{"value":"BESTSELLERS","identifier":"BEST_SELLER"},{"value":"Color","identifier":"Green"},{"value":"Size","identifier":"L"}]},{"ID":"001_2","Attributes":[{"value":"BESTSELLERS","identifier":"BEST_SELLER"},{"value":"Color","identifier":"Yellow"},{"value":"Size","identifier":"M"}]}]},{"ID":"002","Attributes":[{"value":"BESTSELLERS","identifier":"BEST_SELLER"},{"value":"Size","identifier":"L"}],"SKUs":[{"ID":"002_1","Attributes":[{"value":"BESTSELLERS","identifier":"BEST_SELLER"},{"value":"Color","identifier":"Black"},{"value":"Size","identifier":"L"}]},{"ID":"002_2","Attributes":[{"value":"BESTSELLERS","identifier":"BEST_SELLER"},{"value":"Color","identifier":"Grey"}]}]},{"ID":"003","Attributes":[{"value":"BESTSELLERS","identifier":"BEST_SELLER"},{"value":"Color","identifier":"Blue"}],"SKUs":[]}]};

/* Filter each product by the required SKU/attribute criteria */
const result = obj.products.reduce((output, product) => {

  /* Determine if this products SKUs have contain requied attribute values */
  return output.concat(product.SKUs.filter((sku) => {

    const attributes = sku.Attributes;

    /* Search the attributes of this sku, looking for any with values that
    are color or size */
    const hasColor = attributes.some((attribute) => attribute.value === 'Color');
    const hasSize = attributes.some((attribute) => attribute.value === 'Size');

    /* If both attribute values found then this sku matches required criteria */
    return hasColor && hasSize;
  })
  /* Map any filtered sku to it's ID and concat the result to output */
  .map(sku => sku.ID));

}, []);

console.log(result);


0 commentaires

1
votes

avec Réduire code> ": xxx pré>

p>

data = {
  products: [
    {
      ID: "001",
      Attributes: [
        {
          value: "BESTSELLERS",
          identifier: "BEST_SELLER"
        },
        {
          value: "Color",
          identifier: "Green"
        },
        {
          value: "Size",
          identifier: "L"
        }
      ],
      SKUs: [
        {
          ID: "001_1",
          Attributes: [
            {
              value: "BESTSELLERS",
              identifier: "BEST_SELLER"
            },
            {
              value: "Color",
              identifier: "Green"
            },
            {
              value: "Size",
              identifier: "L"
            }
          ]
        },
        {
          ID: "001_2",
          Attributes: [
            {
              value: "BESTSELLERS",
              identifier: "BEST_SELLER"
            },
            {
              value: "Color",
              identifier: "Yellow"
            },
            {
              value: "Size",
              identifier: "M"
            }
          ]
        }
      ]
    },
    {
      ID: "002",
      Attributes: [
        {
          value: "BESTSELLERS",
          identifier: "BEST_SELLER"
        },
        {
          value: "Size",
          identifier: "L"
        }
      ],
      SKUs: [
        {
          ID: "002_1",
          Attributes: [
            {
              value: "BESTSELLERS",
              identifier: "BEST_SELLER"
            },
            {
              value: "Color",
              identifier: "Black"
            },
            {
              value: "Size",
              identifier: "L"
            }
          ]
        },
        {
          ID: "002_2",
          Attributes: [
            {
              value: "BESTSELLERS",
              identifier: "BEST_SELLER"
            },
            {
              value: "Color",
              identifier: "Grey"
            }
          ]
        }
      ]
    },
    {
      ID: "003",
      Attributes: [
        {
          value: "BESTSELLERS",
          identifier: "BEST_SELLER"
        },
        {
          value: "Color",
          identifier: "Blue"
        }
      ],
      SKUs: []
    }
  ]
};

console.log(data.products.reduce((p, c) => (
    (c.SKUs = c.SKUs.filter(
      sku =>
        sku.Attributes.some(att => att.value === "Color") &&
        sku.Attributes.some(att => att.value === "Size")
    )).length && p.push(c), p ),[]
));


0 commentaires

0
votes

Je pense que vous devez vérifier la valeur au lieu de l'identifiant. Basé sur votre objet, la valeur que vous vérifiez est dans la touche Valeur de l'objet Attribut. Vous devez également vérifier la longueur de la matrice de la valeur de retour des filtres internes. Un tableau vide s'il est passé dans une condition sera toujours considéré comme vrai, c'est pourquoi votre filtre renvoie toujours tout le contenu de votre objet. Donc, le filtre devrait ressembler à quelque chose comme ça. xxx


0 commentaires