2012-03-12 13 views
5

Temel olarak, Javascript'te (isteğe bağlı olarak JQuery), belirli bir öğe için iç içe geçmiş öğelere sahip bir JSON'da arama yapıp onu düzenlemek istiyorum.İç içe geçmiş JSON öğelerini arama ve düzenleme

Ex. 110 numaralı "bileşenleri" arayın ve adı "video kartı" olarak değiştirin.

Aşağıdaki JSON'un yalnızca bir örnek olduğuna dikkat edin. Ben javascript kütüphaneleri veya iyi hileler böyle bir şey yapmak için mevcut olup olmadığını merak ediyorum, tüm json çaprazlama veya kendi yöntemleri yazma en iyi çözüm olduğunu düşünmüyorum.

{ 
    "computers": [ 
    { 
    "id": 10, 
    "components": [ 
     { 
      "id": 56, 
      "name": "processor" 
     }, 
     { 
      "id": 24, 
      "name": "ram" 
     } 
     ] 
    }, 
    { 
     "id": 11, 
     "components": [ 
     { 
      "id": 110, 
      "name": "graphic card" 
     }, 
     { 
      "id": 322, 
      "name": "motherboard" 
     } 
     ] 
    } 
    ] 
} 
+2

nesneyi Traversing *** sadece *** seçenektir. Buraya geldiğiniz bütün cevaplar bunu bir şekilde ya da böyle yapacak. – Matt

+0

Tamam, ama kütüphanelerin zaten JSON içinde arama yapmakla kalmayıp aynı zamanda gerçekten düzenleme yapmamı sağlayan böyle bir şeyi yapmak için zaten var olduğuna inanıyorum. – Fr4ncis

+2

Sadece yoldan çıkarmak için: Aradığın zaman, artık JSON değil; sadece bir nesne grafiği. –

cevap

2

linq.js deneyebilirsiniz.

+0

Önemli ölçüde linq.js kullandım ve biraz endişeli olmasına rağmen, harika çalışıyor! –

1

JSJ yapıları üzerinde XPath kullanarak eşleşmeleri filtreleyebileceğiniz bu javascript lib, DefiantJS (http://defiantjs.com) kullanabilirsiniz. JS koduna koymak için:

var data = { 
     "computers": [ 
      { 
      "id": 10, 
      "components": [ 
       { "id": 56, "name": "processor" }, 
       { "id": 24, "name": "ram" } 
      ] 
      }, 
      { 
      "id": 11, 
      "components": [ 
       { "id": 110, "name": "graphic card" }, 
       { "id": 322, "name": "motherboard" } 
      ] 
      } 
     ] 
    }, 
    res = JSON.search(data, '//components[id=110]'); 

res[0].name = 'video card'; 

İşte bir çalışma kemanı;
http://jsfiddle.net/g8fZw/

DefiantJS "arama" yöntemi ile, küresel nesne JSON uzanır ve kibrit bir dizi (eşleşme bulunması halinde, boş bir dizi) döndürür. Burada XPath Değerlendiricisi kullanarak lib ve XPath sorguları da deneyebilirsiniz:

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

İlgili konular