Zadanie:
mamy w javascript tablicę obiektów, przykładowo strukturę jakiejś firmy:
var json = [ { "region_id" : "10", "obszar_id" : "15", "punkt_sprzedazy_id" : 25, "nazwa_punktu" : "Punkt 1" }, { "region_id" : "10", "obszar_id" : "15", "punkt_sprzedazy_id" : 24, "nazwa_punktu" : "Punkt 2" }, { "region_id" : "10", "obszar_id" : "15", "punkt_sprzedazy_id" : 27, "nazwa_punktu" : "Punkt 3" }, { "region_id" : "10", "obszar_id" : "17", "punkt_sprzedazy_id" : 125, "nazwa_punktu" : "Punkt 41" }, { "region_id" : "14", "obszar_id" : "9", "punkt_sprzedazy_id" : 205, "nazwa_punktu" : "Punkt 87" }, { "region_id" : "6", "obszar_id" : "23", "punkt_sprzedazy_id" : 16, "nazwa_punktu" : "Punkt 42" }, ... ];
Teraz chcemy wybrać z tej tablicy tylko punkty sprzedaży z jednego obszaru – czyli np. elementy, dla których obszar_id == 15. Można do tego użyć zewnętrznych bibliotek operujących na formacie JSON, np: jOrder, JSONPath, Jaql, czy jLinq, albo wykorzystać obsługę Array.prototype.filter:
function wybierzPunktyZObszaru(obszar_id) { var Punkty = json.filter(function(el) { return el.obszar_id == obszar_id; }); return Punkty; }
Dla większej ilości warunków łączymy je:
var Punkty2 = json.filter(function(el) { return el.obszar_id == 15 && el.punkt_sprzedazy_id >= 10; });
lub
var Punkty3 = json.filter(function(el) { return el.obszar_id == 15; }).filter(function(el) { return el.punkt_sprzedazy_id >= 10; });
Więcej np. na stackoverflow.
Ważne, żeby dla przeglądarek nieobsługujących Array.prototype.filter dodać lokalną obsługę metody (za dokumentacją):
if (!Array.prototype.filter) { Array.prototype.filter = function(fun /*, thisp */) { "use strict"; if (this === void 0 || this === null) throw new TypeError(); var t = Object(this); var len = t.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 t) { var val = t[i]; // in case fun mutates this if (fun.call(thisp, val, i, t)) res.push(val); } } return res; }; }
Taki fragment dodajemy np. na początku kodu.
Gdyby chcieć skorzystać przykładowo z biblioteki jOrder:
// utwórz obiekt tablicy jOrder i dodaj nieunikalny (grouped: true) indeks 'ix_obszar_id' na polu 'obszar_id' var jsonTable = jOrder.table(json).index('ix_obszar_id', ['obszar_id'], {grouped : true}); // funkcja filtrująca, która zwraca tylko znalezione rekordy (renumber : true) function szukajDaneZObszaru(obszar_id) { return jsonTable.where([{'obszar_id' : obszar_id}], {indexName : 'ix_obszar_id', renumber : true}); } // wyszukaj punkty z obszaru 15 var Dane15 = szukajDaneZObszaru(15);
Więcej przykładów zastosowania jOrder na wiki projektu