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.

996voto

Christian C. Salvadó Punkte 763569

Sie können die Array.prototype.filter Methode:

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

Live-Beispiel:

var obj = {
    '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) ...     
    ]
};
// (Note that because `price` and such are given as strings in your object,
// the below relies on the fact that <= and >= with a string and number
// will coerce the string to a number before comparing.)
var newArray = obj.homes.filter(function (el) {
  return el.price <= 1000 &&
         el.sqft >= 500 &&
         el.num_of_beds >= 2 &&
         el.num_of_baths >= 1.5; // Changed this so a home would match
});
console.log(newArray);

Diese Methode ist Teil des neuen ECMAScript 5. Auflage Standard und ist in fast allen modernen Browsern zu finden.

Für den IE können Sie aus Kompatibilitätsgründen die folgende Methode verwenden:

if (!Array.prototype.filter) {
  Array.prototype.filter = function(fun /*, thisp*/) {
    var len = this.length >>> 0;
    if (typeof fun != "function")
      throw new TypeError();

    var res = [];
    var thisp = arguments[1];
    for (var i = 0; i < len; i++) {
      if (i in this) {
        var val = this[i];
        if (fun.call(thisp, val, i, this))
          res.push(val);
      }
    }
    return res;
  };
}

63voto

Lou Bagel Punkte 791

Ich bin überrascht, dass niemand die einzeilige Antwort gepostet hat:

const filteredHomes = json.homes.filter(x => x.price <= 1000 && x.sqft >= 500 && x.num_of_beds >=2 && x.num_of_baths >= 2.5);

...und damit Sie es besser lesen können:

const filteredHomes = json.homes.filter( x => 
  x.price <= 1000 && 
  x.sqft >= 500 && 
  x.num_of_beds >=2 && 
  x.num_of_baths >= 2.5
);

33voto

Rutesh Makhijani Punkte 16545

Sie können versuchen, ein Framework wie jLinq zu verwenden - im Folgenden finden Sie ein Codebeispiel für die Verwendung von jLinq

var results = jLinq.from(data.users)
.startsWith("first", "a")
.orEndsWith("y")
.orderBy("admin", "age")
.select();

Weitere Informationen finden Sie unter folgendem Link http://www.hugoware.net/projects/jlinq

31voto

JuliaCesar Punkte 1021

Ich bevorzuge das Underscore-Framework. Es schlägt viele nützliche Operationen mit Objekten vor. Ihre Aufgabe:

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

kann überschrieben werden wie:

var newArray = _.filter (homes, function(home) {
    return home.price<=1000 && sqft>=500 && num_of_beds>=2 && num_of_baths>=2.5;
});

Ich hoffe, es wird Ihnen nützlich sein!

14voto

ANIK ISLAM SHOJIB Punkte 2614

Filter verwenden

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",
        },

    ]
}

let filter = 
  json.homes.filter(d => 

    d.price >= 1000 & 
    d.sqft >= 500 & 
    d.num_of_beds >=2 & 
    d.num_of_baths >= 2.5
)

console.log(filter)

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