2013-02-14 7 views
5

Ich bevölkere gerade einige Elemente mit Json. Wenn jedoch ein neuer JSON geladen wird. Der JSON sieht etwas anders aus. Wie kann ich den ersten Teil des Schlüssels ignorieren, damit er funktioniert? Ich dachte, ich könnte ein Sternchen benutzen, aber das gibt mir einen Fehler im Feuerwanze.Ignorieren Teil des Schlüssels in JSON Anruf mit jquery

Hier ist meine jQuery

var items = []; 
    $.each(data[0].attributes['*.dyn.prop.current.profile'], function (key, val) { 
     items.push(val); 
    }); 
    displaySortLabel(items, "type-details"); 

Beispiel JSON 1

[ 
    { 
    "avatarDefinitionId":1, 
    "avatarName":"edge", 
    "attributes":{ 
     "examplePrefixToSkipOver.act.halt":"1", 
     "examplePrefixToSkipOver.dyn.prop.current.profile":"1", 
     "examplePrefixToSkipOver.dyn.prop.firmware":"1.0", 
     "examplePrefixToSkipOver.dyn.prop.ip.address.3g":"192.168.1.1", 
     "examplePrefixToSkipOver.dyn.prop.ip.address.cloud.com":"192.168.1.1", 
     "examplePrefixToSkipOver.dyn.prop.ip.address.lan":"10.0.0.1", 
     "examplePrefixToSkipOver.dyn.prop.ip.address.wifi":"192.168.1.1", 
     "examplePrefixToSkipOver.dyn.prop.location":"Chicago Office", 
     "examplePrefixToSkipOver.dyn.prop.name":"examplePrefixToSkipOver", 
     "examplePrefixToSkipOver.dyn.prop.priority":"1", 
     "examplePrefixToSkipOver.dyn.prop.status.detail":"Placeholder-Text", 
     "examplePrefixToSkipOver.dyn.prop.timestamp":"2010-01-01T12:00:00Z" 

    } 
} 
] 
+0

http://api.jquery.com/attribute-ends-with- selector/ – Shanimal

+0

Wenn du dom-Elemente nicht betrachtest (sorry) könntest du einen regulären Ausdruck vom Schlüsselwert – Shanimal

Antwort

8

Sie eine for Schleife verwenden können:

for (key in data[0].attributes) { 
    if (key.match('.dyn.prop.firmware')) { 
     items.push(data[0].attributes[key]); 
    } 
} 

http://jsfiddle.net/cSF5w/

+0

kompilieren Das würde bedeuten, dass ich viele for-Schleifen in meinen Code schreiben muss. Gibt es überhaupt etwas, das ich etwas globales haben könnte, das überspringt den ersten Teil des Schlüssels so abc.my.data konnte nur durch sayin * .my.data zugegriffen werden – ndesign11

+0

Sie konnten eine Funktion schreiben. +1 zu undefined – Shanimal

+0

gut sagen meine json-Datei hat tausend verschiedene Attribute. Müsste ich nicht für jede eine For-Schleife haben, um [.dyn.prop.firmware, .dyn.prop.time, .dyn.prop.location usw.] anzugeben. – ndesign11

1

Da ich kann der früheren Antwort keine Kommentare hinzufügen. Sie können die Funktion generisch machen. Wie so:

function getAttributesArray(obj, matchKey) { 
    var items = []; 
    for (key in obj) { 
     if (key.match(matchKey)) { 
      items.push(obj[key]); 
     } 
    } 
    return items; 
} 

var label = getAttributesArray(data[0].attributes, '.dyn.prop.firmware') 

displaySortLabel(label, "type-details"); 
+0

Ich versuche nicht, den ersten Teil der Zeichenfolge zu entfernen, so "abc" in (abc.test.string.firmware) – ndesign11

+1

Vielleicht sollten Sie ein Beispiel für Ihre Eingabe geben und was Sie möchten, dass Ihre Ausgabe Sein. –

2

Annahme der Objekte:

var my1 = [{ 
    "attributes": { 
     "edgebox.act.halt": "1", 
      "edgebox.dyn.prop.current.profile": "1", 
      "edgebox.dyn.prop.firmware": "1.0" 
    } 
}]; 
var my2 = [{ 
    "attributes": { 
     "qln220.act.halt": "1", 
      "qln220.dyn.prop.current.profile": "1", 
      "qln220.dyn.prop.firmware": "1.0" 
    } 
}]; 

var items = []; 

function pdata(data) { 
    $.each(data, function (key, val) { 
     items.push({mykey:val}); 
    }); 
} 
pdata(my1[0].attributes); 
pdata(my2[0].attributes); 
alert(items[2].mykey);//alerts "1.0", 

gibt es 6 Objekte in der Anordnung in diesem Beispiel

EDIT: Unter Verwendung dieser gleichen Objekte, sondern behalten die Tasten:

var items = []; 

function pdata(data) { 
    $.each(data, function (key, val) { 
     items.push({mykey:val,origkey:key}); 
    }); 
} 
pdata(my1[0].attributes); 
pdata(my2[0].attributes); 
alert(items[2].mykey+ ":"+items[2].origkey);// alerts "1.0:edgebox.dyn.prop.firmware" 

EDIT2: Streifen Sie den ersten Teil:

function pdata(data) { 
    $.each(data, function (key, val) { 
     items.push({ 
      mykey: val, 
      origkey:(key.substring(key.indexOf(".")+1)) 
     }); 
    }); 
} 

Geige für Ihr Vergnügen: http://jsfiddle.net/ThXHd/1/

+0

Ich versuche nur, über den ersten Teil der Schlüsselzeichenfolge hinaus zu schauen, ich versuche nicht, nach diesem ersten Teil eine Übereinstimmung zu finden, weil sie ziemlich abit variieren könnte. Ich habe meinen JSON aktualisiert, um zu zeigen, wie stark er variiert. Obwohl die Varianz in allen verschiedenen JSON-Dateien mit Ausnahme des allerersten Teils des Schlüssels besteht. – ndesign11

+1

Hier ist eine Geige, die die Verwendung des Schlüssel/Wert-Krams zeigt: http://jsfiddle.net/ThXHd/ mit deinen neuesten Daten –

+0

und dies würde mit meiner jQuery von oben funktionieren? var items = []; $ .each (data [0] .attributes ['*. Dyn.prop.firmware'], Funktion (Schlüssel, Wert) { items.push (val); }); displaySortLabel (Elemente, "Typ-Details"); – ndesign11

0

Wenn Sie nur den ersten Teil des Schlüssels entfernen möchten Sie den Schlüssel aftert den ersten Index von Scheiben schneiden kann ‚‘ und verwenden Sie die geänderten Werte, um sie Ihrem Modell zuzuordnen.

var newKey = key.slice(key.indexOf('.') + 1)

+0

Wie würde das mit der jQuery funktionieren, die ich in meinem Beitrag erstellt habe? Ich kann Ihren Vorschlag nicht fehlerfrei integrieren. – ndesign11

2
var items = []; 
for (key in data[0].attributes) { 
    if (key.match('.stat.prop.type')) { 
     items.push(data[0].attributes[key]) 
    } 
} 

displaySortLabel(items, "type-details"); 
0

Gebäude aus Beispiel Bonnarooster suchen:

function getAttribute(attr, item) { 
    var items = []; 
    $.each(item.attributes, function (key, val) { 
     if (key.slice(key.indexOf('.') + 1) == attr) 
      items.push(val); 
    }); 
    return items; 
}; 

Jetzt können Sie anrufen:

getAttribute('dyn.prop.current.profile', data[0]); 
0

Leider kann ich noch nicht auf Antworten kommentieren, aber @undefined hatte genau die richtige Idee (obwohl es überprüfen sollte, dass es nur dem Ende des Attributs entspricht) Bute Name). So würden Sie es in eine Funktion bringen.

Um ein einzelnes Attribut zu erhalten:

function getOneWithSuffix(obj,suffix){ 
    for(var key in obj){ 
     if(key.substr(key.length-suffix.length)===suffix){ 
      return obj[key]; 
     } 
    } 
    return undefined; 
} 
// usage: myValue = getOneWithSuffix(data[0].attributes, '.dyn.prop.current.profile') 

Oder ein Array aller passenden Attributwerte zu erhalten:

function getManyWithSuffix(obj,suffix){ 
    var ret=[]; 
    for(var key in obj){ 
     if(key.substr(key.length-suffix.length)===suffix){ 
      ret.push(obj[key]); 
     } 
    } 
    return ret; 
} 
// usage: myValuesArray = getManyWithSuffix(data[0].attributes, '.dyn.prop.current.profile') 

Sie auch reguläre Ausdrücke in der Anpassungs verwenden könnten, wenn Sie mehr Flexibilität wünschen.

0

Mit Blick auf einige der anderen Antworten denke ich, dass Sie einige "Kopieren und Einfügen" -Lösung möchten.

Hier ist was ich habe.

$.each(data[0].attributes, function(key, val){ 
    if(key.substr(key.indexOf('.',1)+1) === 'dyn.prop.current.profile') 
     items.push(val); 
}); 

Ich habe gerade setzen, was schon einige Leute in dieser Geige beantwortet, hoffe, es funktioniert: D

http://jsfiddle.net/n3jca/1/

Verwandte Themen