J'ai un objet JSON comme celui-ci: Comme vous pouvez le constater, Je veux obtenir tous ces skus qui ont strong> les attributs - Donc, il devrait renvoyer P> Donc, j'ai écrit le code suivant: P> Produits code> est un tableau contenant un autre tableau
SKU code> qui contient un autre tableau
attributs code>. p>
taille code> et couleur code> pour eux. p>
skus 001_1, 001_2 et 002_1 code> p>
blockQuote>
var obj = JSON.parse('<MyAboveJSONObjectHere>');
obj.products.filter( p => p.SKUs.filter(sku => sku.Attributes.filter(att =>
att.identifier === 'Color' && att.identifier === 'Size')))
4 Réponses :
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
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 Ceci peut être atteint via un p> attribut code > Sous-tableaux qui contenaient des valeurs de
"couleur" code> et
"taille" code>.
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>
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);
avec p> Réduire code> ":
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 ),[]
));
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.
att.identifier === 'couleur' && att.identifier === 'Taille' code> Une propriété ne peut pas contenir deux valeurs différentes à la fois
Essayez
att.identifier === 'couleur' || att.identifier === 'Taille' Code>
Puisque votre structure semble standard, vous pouvez accéder à
1 code> et
2 code> index pour vérifier si
couleur et taille code> est disponible ou non
N'est-ce pas Att.Value == 'couleur' && att.value == 'Taille'?