2011-01-11 10 views

Antwort

6

Das ist der direkte Weg, dies zu tun. Wenn Sie mehrmals schnell Zugriff benötigen, sollten Sie eine Zuordnung erstellen, die durch den Namen der Eigenschaft verschlüsselt wird, nach der Sie suchen.

Hier ist eine Funktion, die Arrays aufnimmt und Keyed Maps erstellt. Es ist nicht universell, aber Sie sollten es für Ihre eigenen Zwecke ändern können.

/** 
* Given an array and a property name to key by, returns a map that is keyed by each array element's chosen property 
* This method supports nested lists 
* Sample input: list = [{a: 1, b:2}, {a:5, b:7}, [{a:8, b:6}, {a:7, b:7}]]; prop = 'a' 
* Sample output: {'1': {a: 1, b:2}, '5': {a:5, b:7}, '8': {a:8, b:6}, '7':{a:7, b:7}} 
* @param {object[]} list of objects to be transformed into a keyed object 
* @param {string} keyByProp The name of the property to key by 
* @return {object} Map keyed by the given property's values 
*/ 
function mapFromArray (list , keyByProp) { 
    var map = {}; 
    for (var i=0, item; item = list[i]; i++) { 
    if (item instanceof Array) { 
     // Ext.apply just copies all properties from one object to another, 
     // you'll have to use something else. this is only required to support nested arrays. 
     Ext.apply(map, mapFromArray(item, keyByProp)); 
    } else { 
     map[item[keyByProp]] = item; 
    } 
    } 
    return map; 
}; 
2

@jondavidjohn - Sie können diese Javascript-lib, DefiantJS (http://defiantjs.com) verwenden, mit dem Sie Übereinstimmungen mit XPath auf JSON Strukturen filtern. Um es in JS-Code zu setzen:

var data = [ 
    { 
     "restaurant": { 
     "name": "McDonald's", 
     "food": "burger" 
     } 
    }, 
    { 
     "restaurant": { 
     "name": "KFC", 
     "food": "chicken" 
     } 
    }, 
    { 
     "restaurant": { 
     "name": "Pizza Hut", 
     "food": "pizza" 
     } 
    } 
]. 
res = JSON.search(data, '//*[food="pizza"]'); 

console.log(res[0].name); 
// Pizza Hut 

Hier ist eine Arbeitsgeige;
http://jsfiddle.net/hbi99/weKVL/

DefiantJS erweitert das globale Objekt mit der Methode "search" und gibt ein Array mit Übereinstimmungen zurück (leeres Array, wenn keine Übereinstimmungen gefunden wurden). Sie können die Lib- und XPath-Abfragen mit dem XPath Evaluator hier ausprobieren:

http://www.defiantjs.com/#xpath_evaluator

Verwandte Themen