J'ai un tableau d'objets JSON. Je crée un filtre pour filtrer ces données.
allData.items.filter(item => item.orderNumber.toString().includes(this.state[this.state.selectedFilters[i]]))
Si la condition de filtre est: (Trouver les éléments où orderNumbers contient 10)
Puis Output:
for(var i=0; i<selectedFilters.length; i++) {
allData.items.filter(item => item.________.toString().includes(this.state[this.state.selectedFilters[i]]))
}
Si la condition de filtrage est: (Trouver les articles où orderNumbers contient 114)
Puis sortie:
selectedFilters = [orderNumberData, areaData,........]
Si la condition de filtrage est: (Trouver les éléments où orderNumber contient 10 et area contient EM)
Puis Sortie:
this.state = {
orderNumberData: '',
areaData: '',
.
.
.
.
}
Existe-t-il un moyen de réaliser la concaténation de filtres successifs?
EDIT: J'essaie de le rendre général.
J'ai stocké les valeurs du champ de filtre dans l'objet d'état.
{
"items":[
{
"orderNumber": 1020,
"area": "EM-JAPAN",
"category": "red",
"orderApprover": "Paul Smith"
},
{
"orderNumber": 1013,
"area": "EMEA",
"category": "orange",
"orderApprover": "Mike Smith"
}
]}
Array selectedFilters stocke les filtres.
Comme ceci:
{
"items":[
{
"orderNumber": 1140,
"area": "APAC",
"category": "yellow",
"orderApprover": "Jake Smith"
}
]
}
Comment puis-je itérer maintenant et obtenir le filtre souhaité. J'essaie de parcourir le tableau selectedFilters et de vérifier chaque élément qui comprend la chaîne souhaitée. Je ne sais pas comment remplir le champ vide avec le champ d'objet JSON basé sur le tableau selectedFilters. Une sorte de mappage entre les deux est nécessaire. Disons que si selectedFilters [1] = orderNumberData, alors orderNumber devrait entrer dans ce vide.
{
"items":[
{
"orderNumber": 1010,
"area": "JAPAN",
"category": "orange",
"orderApprover": "John Smith"
},
{
"orderNumber": 1020,
"area": "EM-JAPAN",
"category": "red",
"orderApprover": "Paul Smith"
},
{
"orderNumber": 1013,
"area": "EMEA",
"category": "orange",
"orderApprover": "Mike Smith"
}
]}
Cela fonctionne si j'ai codé en dur les champs JSON.
var allData = {
"items":[
{
"orderNumber": 1010,
"area": "JAPAN",
"category": "orange",
"orderApprover": "John Smith"
},
{
"orderNumber": 1020,
"area": "EM-JAPAN",
"category": "red",
"orderApprover": "Paul Smith"
},
{
"orderNumber": 1013,
"area": "EMEA",
"category": "orange",
"orderApprover": "Mike Smith"
},
{
"orderNumber": 1140,
"area": "APAC",
"category": "yellow",
"orderApprover": "Jake Smith"
}
]}
3 Réponses :
Vous pouvez utiliser le filtre, mais comme orderNumber est un entier, utilisez toString pour le convertir en chaîne, puis utilisez includes pour vérifier si le values contient le nombre souhaité
var allData = {
"items": [{
"orderNumber": 1010,
"area": "JAPAN",
"category": "orange",
"orderApprover": "John Smith"
},
{
"orderNumber": 1020,
"area": "EM-JAPAN",
"category": "red",
"orderApprover": "Paul Smith"
},
{
"orderNumber": 1013,
"area": "EMEA",
"category": "orange",
"orderApprover": "Mike Smith"
},
{
"orderNumber": 1140,
"area": "APAC",
"category": "yellow",
"orderApprover": "Jake Smith"
}
]
}
let data = allData.items.filter(item => item.orderNumber.toString().includes('10'));
console.log(data)
Vous pouvez affiner davantage le rappel du filtre pour intégrer la recherche EM
Merci @brk. Essaiera d'ajouter des conditions sur les opérations de filtrage successives.
Vous pouvez déplacer les informations de contraintes dans un tableau de filtres et un filtre en vérifiant toutes les contraintes (condition ET) avec Array # every ou si vous n'en voulez que certains (condition OR), prenez Array # some .
var data = [{ orderNumber: 1010, area: "JAPAN", category: "orange", orderApprover: "John Smith" }, { orderNumber: 1020, area: "EM-JAPAN", category: "red", orderApprover: "Paul Smith" }, { orderNumber: 1013, area: "EMEA", category: "orange", orderApprover: "Mike Smith" }, { orderNumber: 1140, area: "APAC", category: "yellow", orderApprover: "Jake Smith" }],
filters = [
o => o.orderNumber.toString().includes('10'),
o => o.area.includes('EM')
],
result = data.filter(o => filters.every(fn => fn(o)));
console.log(result);
Merci @Nina Scholz. Avoir plusieurs filtres définis au même endroit est un bon conseil. J'essaierai cette approche.
Nous pouvons obtenir un filtrage dynamique en plaçant les critères de filtre dans un tableau externe. Dans mon exemple, il s'agit du tableau filterCond .
Ensuite, parcourez le tableau des conditions de filtre et vérifiez si chaque valeur de la propriété de l'objet correspond aux données du filterCond tableau dans le même index.
Si la condition est fausse, incrémenter un compteur, et retourner faux si le compteur est supérieur à 0.
Les critères doivent être placé selon l'index des clés dans l'objet.
var allData = {"items":[{ orderNumber: 1010, area: "JAPAN", category: "orange", orderApprover: "John Smith" }, { orderNumber: 1020, area: "EM-JAPAN", category: "red", orderApprover: "Paul Smith" }, { orderNumber: 1013, area: "EMEA", category: "orange", orderApprover: "Mike Smith" }, { orderNumber: 1140, area: "APAC", category: "yellow", orderApprover: "Jake Smith" }]};
function getFilteredData(allData, filterCond){
return allData.items.filter((itm) =>{
count = 0;
filterCond.forEach((cond, idx) => {
count = Object.values(itm)[idx].toString().includes(cond) === false ? count + 1: count;
})
return count === 0;
});
}
console.log("Filtering by orderNumber 10 and area EM");
let filterCond = ["10", "EM"];
console.log(getFilteredData(allData, filterCond));
console.log("Filtering by orderNumber 114");
filterCond = [114];
console.log(getFilteredData(allData, filterCond));
console.log("Filtering by only orderNumber 10");
filterCond = [10];
console.log(getFilteredData(allData, filterCond));
console.log("Filtering by only area APAC");
filterCond = [, "APAC"]; //leaving first criteria blank
console.log(getFilteredData(allData, filterCond));
pouvez-vous s'il vous plaît élaborer l'approche. Quelle était la signification du compte ici ??
@Deepak Laxkar count détermine si l'une des conditions de filtre ne correspond pas. s'il y a une discordance, le compte sera différent de zéro. Avec cela, je peux savoir que certaines valeurs n'étaient pas présentes dans l'objet.
vous devriez consulter une documentation sur la méthode de filtrage w3schools.com/jsref/jsref_filter.asp