web-dev-qa-db-fra.com

filtre javascript tableau d'objets

J'ai un tableau d'objets et je me demande quel est le meilleur moyen de le rechercher. Étant donné l'exemple ci-dessous, comment puis-je rechercher name = "Joe" et age < 30? Y at-il quelque chose que jQuery peut aider ou dois-je forcer brutalement cette recherche moi-même?

var names = new Array();

var object = { name : "Joe", age:20, email: "[email protected]"};
names.Push(object);

object = { name : "Mike", age:50, email: "[email protected]"};
names.Push(object);

object = { name : "Joe", age:45, email: "[email protected]"};
names.Push(object);
73
user441521

Vous pouvez utiliser jQuery.grep() :

var found_names = $.grep(names, function(v) {
    return v.name === "Joe" && v.age < 30;
});

DEMO: http://jsfiddle.net/ejPV4/

112
VisioN

Vous pouvez le faire très facilement avec le [].filter méthode:

var filterednames = names.filter(function(obj) {
    return (obj.name === "Joe") && (obj.age < 30);
});

Vous devrez ajouter un shim pour les navigateurs qui ne supportent pas le [].filter méthode: cette page MDN donne un tel code.

69
lonesomeday

Vous pouvez utiliser la fonction jQuery.filter () pour renvoyer des éléments à partir d’un sous-ensemble des éléments correspondants.

var names = [
    { name : "Joe", age:20, email: "[email protected]"},
    { name : "Mike", age:50, email: "[email protected]"},
    { name : "Joe", age:45, email: "[email protected]"}
   ];
   
   
var filteredNames = $(names).filter(function( idx ) {
    return names[idx].name === "Joe" && names[idx].age < 30;
}); 

$(filteredNames).each(function(){
     $('#output').append(this.name);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="output"/>
7
Vadim Gremyachev
var nameList = [
{name:'x', age:20, email:'[email protected]'},
{name:'y', age:60, email:'[email protected]'},
{name:'Joe', age:22, email:'[email protected]'},
{name:'Abc', age:40, email:'[email protected]'}
];

var filteredValue = nameList.filter(function (item) {
      return item.name == "Joe" && item.age < 30;
});

//To See Output Result as Array
alert(JSON.stringify(filteredValue));

Vous pouvez simplement utiliser javascript :)

4
Fakhrul Hasan
var names = [{
        name: "Joe",
        age: 20,
        email: "[email protected]"
    },
    {
        name: "Mike",
        age: 50,
        email: "[email protected]"
    },
    {
        name: "Joe",
        age: 45,
        email: "[email protected]"
    }
];
const res = _.filter(names, (name) => {
    return name.name == "Joe" && name.age < 30;

});
console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js"></script>
0
Parth Raval

Alors question rapide. Que se passe-t-il si vous avez deux tableaux d'objets et que vous souhaitez "aligner" ces tableaux d'objets afin de vous assurer que les objets de chaque tableau sont dans l'ordre de ceux de l'autre? Que faire si vous ne savez pas quelles clés et quels valeurs les objets contenus dans les tableaux contiennent ... beaucoup moins dans quel ordre ils se trouvent?

Il vous faut donc une "WildCard Expression" pour votre [].filter, [].map, etc. Comment obtenez-vous une expression générique?

var jux = (function(){
    'use strict';

    function wildExp(obj){
        var keysCrude = Object.keys(obj),
            keysA = ('a["' + keysCrude.join('"], a["') + '"]').split(', '),
            keysB = ('b["' + keysCrude.join('"], b["') + '"]').split(', '),
            keys = [].concat(keysA, keysB)
                .sort(function(a, b){  return a.substring(1, a.length) > b.substring(1, b.length); });
        var exp = keys.join('').split(']b').join('] > b').split(']a').join('] || a');
        return exp;
    }

    return {
        sort: wildExp
    };

})();

var sortKeys = {
    k: 'v',
    key: 'val',
    n: 'p',
    name: 'param'
};
var objArray = [
    {
        k: 'z',
        key: 'g',
        n: 'a',
        name: 'b'
    },
    {
        k: 'y',
        key: 'h',
        n: 'b',
        name: 't'
    },
    {
        k: 'x',
        key: 'o',
        n: 'a',
        name: 'c'
    }
];
var exp = jux.sort(sortKeys);

console.log('@juxSort Expression:', exp);
console.log('@juxSort:', objArray.sort(function(a, b){
    return eval(exp);
}));

Vous pouvez également utiliser cette fonction sur une itération pour chaque objet pour créer une meilleure expression collective pour toutes les clés de chacun de vos objets, puis filtrer votre tableau de cette manière.

C’est un petit extrait de l’API Juxtapose que j’ai presque terminé, ce qui permet d’obtenir l’égalité d’objets avec les exemptions, les unités d’objets et la condensation de tableaux. Si ce sont des choses dont vous avez besoin ou que vous voulez pour votre projet, veuillez commenter et je rendrai la bibliothèque accessible le plus tôt possible.

J'espère que cela t'aides! Bonne codage :)

0
Cody