2012-11-27 10 views
63

Mam szereg obiektów i zastanawiam się, jak najlepiej je przeszukać. Biorąc pod uwagę poniższy przykład, jak mogę wyszukać name = "Joe" i age < 30? Czy jest coś, z czym jQuery może pomóc, czy też muszę brutalnie wymuszać to wyszukiwanie?tablica filtrów javascript obiektów

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); 
+0

Przez poszukiwaniu masz na myśli filtr? – joragupra

Odpowiedz

64

Można to zrobić bardzo łatwo metodą [].filter:

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

trzeba będzie Dodaj podkładka dla przeglądarek, które nie obsługują metody [].filter: this MDN page podaje taki kod.

+0

Proponuję przyjrzeć się polyfillowi na połączonej stronie MDN, po to, żeby mieć fajny kod do czytania i nauczyć się czegoś nowego. – Nobita

0

Szybkie pytanie. Co się stanie, jeśli masz dwie tablice obiektów i chcesz "wyrównać" te tablice obiektów, abyś mógł upewnić się, że obiekty każdej z tablic są w takiej samej kolejności, jak inne macierze? A co, jeśli nie wiesz, jakie klucze i wartości zawiera każdy z obiektów znajdujących się wewnątrz tablic ... O wiele mniej, w jakiej kolejności się znajdują?

Potrzebujesz "WildCard Expression" dla swoich [].filter, [].map itd. Jak uzyskać wyrażenie wieloznaczne?

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); 
})); 

Można również korzystać z tej funkcji w ciągu iteracji dla każdego obiektu w celu stworzenia lepszego zbiorowej ekspresji dla wszystkich kluczy w każdym z obiektów, a następnie filtrować swoją tablicę w ten sposób.

To jest mały fragment z API Juxtapose, który mam prawie ukończony, który to robi, równość obiektów z wyjątkami, jedności obiektów i kondensacji tablic. Jeśli są to rzeczy, które potrzebujesz lub chcesz dla swojego projektu, skomentuj, a ja sprawię, że lib będzie dostępny wcześniej niż później.

Mam nadzieję, że to pomoże! Szczęśliwe kodowanie :)

6

Można użyć funkcji jQuery.filter() do zwracania elementów z podzbioru pasujących elementów.

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"/>

1

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));

można po prostu użyć javascript :)

Powiązane problemy