2017-10-21 132 views
4

Je veux filtrer ce tableau de données en tableau d'états et de villes. Comment puis-je y parvenir en utilisant lodash ou tout autre moyen plutôt que pour la boucle et le maintien de tableaux supplémentaires.Comment filtrer le tableau d'objets en réagissant natif?

data: [ 
    { id: 1, name: Mike, city: philps, state: New York}, 
    { id: 2, name: Steve, city: Square, state: Chicago}, 
    { id: 3, name: Jhon, city: market, state: New York}, 
    { id: 4, name: philps, city: booket, state: Texas}, 
    { id: 5, name: smith, city: brookfield, state: Florida}, 
    { id: 6, name: Broom, city: old street, state: Florida}, 
] 

l'utilisateur clique sur state, la liste des états s'affiche.

{state: New York, count: 2}, 
{state: Texas, count: 1}, 
{state: Florida, count: 2}, 
{state: Chicago, count: 1}, 

Lorsque l'utilisateur clique sur un état particulier, la liste de cities de cet état s'affiche. Par ex. lorsque l'utilisateur clique sur l'état de New York,

{id:1, name: Mike, city: philps} 
{id:3, name: Jhon, city: market} 
+2

double possible de [Quelle est la méthode la plus efficace pour GroupBy sur un tableau JavaScript d'objets?] (Https://stackoverflow.com/questions/14446511/what-is-the -la-méthode-la-plus-efficace-à-grouper-sur-un-javascript-array-of-objects) – bennygenel

Répondre

2

Avec lodash, vous pouvez utiliser _.filter avec un objet comme _.matches iteratee raccourci pour filtrer l'objet avec une paire de clé donnée/valeur et

utilisation _.countBy avec _.map pour obtenir un nombre d'états.

var data = [{ id: 1, name: 'Mike', city: 'philps', state: 'New York' }, { id: 2, name: 'Steve', city: 'Square', state: 'Chicago' }, { id: 3, name: 'Jhon', city: 'market', state: 'New York' }, { id: 4, name: 'philps', city: 'booket', state: 'Texas' }, { id: 5, name: 'smith', city: 'brookfield', state: 'Florida' }, { id: 6, name: 'Broom', city: 'old street', state: 'Florida' }]; 
 

 
console.log(_.filter(data, { state: 'New York' })); 
 
console.log(_ 
 
    .chain(data) 
 
    .countBy('state') 
 
    .map((v, k) => ({ state: k, count: v })) 
 
    .value() 
 
);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

+0

pour le nombre d'états, ce qui entraîne l'impression de la matrice de données. – Balasubramanian

+0

La sortie est exactement correcte comme en sinppet. Mais je ne reçois pas la même chose. – Balasubramanian

+0

Pour la deuxième console. Obtenir des données comme résultat – Balasubramanian

4

Vous pouvez le faire en utilisant native javascript en appliquant la méthode filter qui accepte comme paramètre une fonction fournie callback.

let data= [ 
 
    { id: 1, name: 'Mike', city: 'philps', state:'New York'}, 
 
    { id: 2, name: 'Steve', city: 'Square', state: 'Chicago'}, 
 
    { id: 3, name: 'Jhon', city: 'market', state: 'New York'}, 
 
    { id: 4, name: 'philps', city: 'booket', state: 'Texas'}, 
 
    { id: 5, name: 'smith', city: 'brookfield', state: 'Florida'}, 
 
    { id: 6, name: 'Broom', city: 'old street', state: 'Florida'}, 
 
] 
 
data=data.filter(function(item){ 
 
    return item.state=='New York'; 
 
}).map(function(item){ 
 
    delete item.state; 
 
    return item; 
 
}); 
 
console.log(data);

2

Ceci est assez simple en utilisant Array.prototype.filter, Array.prototype.map, Array.prototype.reduce et déstructurant:

//filter by particular state 
const state = /*the given state*/; 
const filtered = data 
.filter(e => e.state == state)//filter to only keep elements from the same state 
.map(e => { 
    const {id, name, city} = e; 
    return {id, name, city}; 
});//only keep the desired data ie id, name and city 

//get states array 
const states = data 
.reduce((acc, elem) => { 
    const state_names = acc.map(e => e.state);//get all registered names 

    if(state_names.includes(elem.state)){//if it is already there 
    const index = acc.find(e => e.state==elem.state); 
    acc[index] = {state: acc[index].state, count: acc[index].count+1};//increment it's count 
    return acc; 
    }else//otherwise 
    return [...acc, {state: elem.state, count: 1}];//create it 
}, []); 

cf this jsfiddle pour le voir en action.