699 Stimmen

Wie filtern Objekt Array basierend auf Attribute?

Ich habe die folgenden JavaScript-Array von Immobilien zu Hause Objekte:

var json = {
    'homes': [{
            "home_id": "1",
            "price": "925",
            "sqft": "1100",
            "num_of_beds": "2",
            "num_of_baths": "2.0",
        }, {
            "home_id": "2",
            "price": "1425",
            "sqft": "1900",
            "num_of_beds": "4",
            "num_of_baths": "2.5",
        },
        // ... (more homes) ...     
    ]
}

var xmlhttp = eval('(' + json + ')');
homes = xmlhttp.homes;

Ich möchte einen Filter auf das Objekt anwenden können, um eine Teilmenge der "Home"-Objekte zurückzugeben.

Ich möchte zum Beispiel nach folgenden Kriterien filtern können: price , sqft , num_of_beds y num_of_baths .

Wie kann ich etwas in JavaScript wie den unten stehenden Pseudocode ausführen?

var newArray = homes.filter(
    price <= 1000 & 
    sqft >= 500 & 
    num_of_beds >=2 & 
    num_of_baths >= 2.5 );

Beachten Sie, dass die Syntax nicht genau wie oben beschrieben sein muss. Dies ist nur ein Beispiel.

12voto

Hier ist die Arbeit fiddle, die gut in IE8 mit jquery MAP-Funktion funktioniert

http://jsfiddle.net/533135/Cj4j7/

json.HOMES = $.map(json.HOMES, function(val, key) {
    if (Number(val.price) <= 1000
            && Number(val.sqft) >= 500
            && Number(val.num_of_beds) >=2
            && Number(val.num_of_baths ) >= 2.5)
        return val;
});

9voto

Tejs Punkte 39916

Sie könnten dies ziemlich leicht tun - es gibt wahrscheinlich viele Implementierungen, die Sie aus wählen können, aber dies ist meine grundlegende Idee (und es gibt wahrscheinlich irgendein Format, wo Sie über ein Objekt mit jQuery iterieren können, ich kippe gerade jetzt daran denken):

function filter(collection, predicate)
{
    var result = new Array();
    var length = collection.length;

    for(var j = 0; j < length; j++)
    {
        if(predicate(collection[j]) == true)
        {
             result.push(collection[j]);
        }
    }

    return result;
}

Und dann können Sie diese Funktion wie folgt aufrufen:

filter(json, function(element)
{
    if(element.price <= 1000 && element.sqft >= 500 && element.num_of_beds > 2 && element.num_of_baths > 2.5)
        return true;

    return false;
});

Auf diese Weise können Sie den Filter auf der Grundlage eines von Ihnen definierten Prädikats aufrufen oder sogar mehrere Filter mit kleineren Filtern verwenden.

9voto

Akira Yamamoto Punkte 4406

Sie können jQuery.grep() seit jQuery 1.0 verwenden:

$.grep(homes, function (h) {
  return h.price <= 1000
    && h.sqft >= 500
    && h.num_of_beds >= 2
    && h.num_of_baths >= 2.5
});

5voto

Thức Trần Punkte 69
const y = 'search text';
const a = [{key: "x", "val: "y"},  {key: "d", "val: "z"}]
const data = a.filter(res => {
        return(JSON.stringify(res).toLocaleLowerCase()).match(y.toLocaleLowerCase());
});

5voto

JohnPan Punkte 1070

Ich benutze meine ruleOut Funktion zum Filtern von Objekten auf der Grundlage von bestimmte unerwünschte Eigenschaftswerte. Ich verstehe, dass Sie in Ihrem Beispiel Bedingungen anstelle von Werten verwenden möchten, aber meine Antwort ist für den Titel der Frage gültig, also möchte ich meine Methode hier lassen.

function ruleOut(arr, filterObj, applyAllFilters=true) {    
    return arr.filter( row => {            
        for (var field in filterObj) {
            var val = row[field];
            if (val) {                    
                if (applyAllFilters && filterObj[field].indexOf(val) > -1) return false;                
                else if (!applyAllFilters) {                        
                    return filterObj[field].filter(function(filterValue){ 
                        return (val.indexOf(filterValue)>-1);
                    }).length == 0;                 
                }
            }
        }
        return true;
    });
}

Nehmen wir an, Sie haben eine Liste von Akteuren wie diese:

let actors = [
  {userName:"Mary", job:"star", language:"Turkish"},
  {userName:"John", job:"actor", language:"Turkish"},
  {userName:"Takis", job:"star", language:"Greek"},
  {userName:"Joe", job:"star", language:"Turkish"},
  {userName:"Bill", job:"star", language:"Turkish"}
];

und Sie möchten alle Schauspieler finden, die als Holywood-Stars eingestuft sind, sollte ihre Nationalität nicht "Englisch", "Italienisch", "Spanisch" oder "Griechisch" sein, und ihr Name sollte nicht "Mary" oder "Joe" sein. Bizarres Beispiel, ich weiß! Wie auch immer, mit dieser Reihe von Bedingungen würden Sie das folgende Objekt erstellen:

let unwantedFieldsFilter= { 
  userName: ['Mary', 'Joe'],    
  job: ['actor'],   
  language: ['English', 'Italian', 'Spanish', 'Greek']  
};

OK, wenn Sie jetzt ruleOut(actors, unwantedFieldsFilter) würden Sie nur erhalten

[{Benutzername: "Bill", Beruf: "star", Sprache: "Türkisch"}]

Und Bill ist dein Mann, denn sein Name ist nicht einer von 'Mary', 'Joe', seine Nationalität ist nicht in ['Englisch', 'Italienisch', 'Spanisch', 'Griechisch'] enthalten und er ist ein Star!

In meiner Methode gibt es eine Option, die lautet applyAllFilters und ist standardmäßig wahr. Wenn Sie versuchen würden, mit diesem Parameter "false" auszuschließen, würde dies als "OR"-Filterung anstelle von "AND" funktionieren. Beispiel: ruleOut(actors, {job:["actor"], language:["Italian"]}, false) würden Sie jeden bekommen, der kein Schauspieler oder Italiener ist:

[{Benutzername: "Mary", Job: "Stern", Sprache: "Türkisch"},
{Benutzername: "Takis", Job: "Stern", Sprache: "Griechisch"},
{Benutzername: "Joe", Job: "Stern", Sprache: "Türkisch"},
{Benutzername: "Bill", Job: "Stern", Sprache: "Türkisch"}]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X