705 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.

4voto

user4620852 Punkte 41

Sie können selbst eine Filtermethode implementieren, die Ihren Bedürfnissen entspricht, und zwar wie folgt:

function myfilter(array, test){
    var passedTest =[];
    for (var i = 0; i < array.length; i++) {
       if(test( array[i]))
          passedTest.push(array[i]);
    }

    return passedTest;
}

var passedHomes = myfilter(homes,function(currentHome){
     return ((currentHome.price <= 1000 )&& (currentHome.sqft >= 500 )&&(currentHome.num_of_beds >=2 )&&(currentHome.num_of_baths >= 2.5));
});

Ich hoffe, es hilft!

3voto

Eric Punkte 8732

Sie sollten sich informieren über OGX.List das über eingebaute Filtermethoden verfügt und das Standard-Javascript-Array erweitert (und auch Gruppierung, Sortierung und Suche). Hier ist eine Liste der Operatoren unterstützt es für die Filter:

'eq' //Equal to
'eqjson' //For deep objects, JSON comparison, equal to
'neq' //Not equal to
'in' //Contains
'nin' //Doesn't contain
'lt' //Lesser than
'lte' //Lesser or equal to
'gt' //Greater than
'gte' //Greater or equal to
'btw' //Between, expects value to be array [_from_, _to_]
'substr' //Substring mode, equal to, expects value to be array [_from_, _to_, _niddle_]
'regex' //Regex match

So können Sie es verwenden

  let list = new OGX.List(your_array);
  list.addFilter('price', 'btw', 100, 500);
  list.addFilter('sqft', 'gte', 500);
  let filtered_list = list.filter();

Oder sogar auf diese Weise

  let list = new OGX.List(your_array);
  let filtered_list = list.get({price:{btw:[100,500]}, sqft:{gte:500}});

Oder als Einzeiler

   let filtered_list = new OGX.List(your_array).get({price:{btw:[100,500]}, sqft:{gte:500}});

2voto

Nux Punkte 7922

Oder Sie können einfach Folgendes verwenden $.each (was auch für Objekte funktioniert, nicht nur für Arrays) und erstellen Sie ein neues Array wie folgt:

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) ...     
        {
            "home_id": "3-will-be-matched",
            "price": "925",
            "sqft": "1000",
            "num_of_beds": "2",
            "num_of_baths": "2.5",
        },
    ]
}

var homes = [];
$.each(json.homes, function(){
    if (this.price <= 1000
        && this.sqft >= 500
        && this.num_of_beds >= 2
        && this.num_of_baths >= 2.5
    ) {
        homes.push(this);
    }
});

2voto

hardik beladiya Punkte 238
var filterHome = homes.filter(home =>
  return (home.price <= 999 &&
         home.num_of_baths >= 2.5 &&
         home.num_of_beds >=2 &&
         home.sqft >= 998));
console.log(filterHome);

Sie können diese Lambda-Funktion verwenden. Weitere Details finden Sie hier, da wir die Daten filtern, die auf einer Bedingung basieren, die wahr oder falsch zurückgibt und die Daten in einem anderen Array sammelt, so dass Ihr aktuelles Array nicht verändert wird.

@JGreig Bitte prüfen Sie das.

1voto

Harshal Punkte 4630
const state.contactList = [{
    name: 'jane',
    email: 'jane@gmail.com'
  },{},{},...]

const fileredArray = state.contactsList.filter((contactItem) => {
  const regex = new RegExp(`${action.payload}`, 'gi');
  return contactItem.nameProperty.match(regex) || 
    contactItem.emailProperty.match(regex);
});

// contactList: all the contacts stored in state
// action.payload: whatever typed in search field

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