2013-08-01 24 views
5

Ho usato questo codice per trovare la porzione richiesta dall'oggetto JSON da sJhonny's QuestionTrovare e aggiornamento in oggetto JSON nidificato

dati di esempio

TestObj = { 
    "Categories": [{ 
     "Products": [{ 
      "id": "a01", 
      "name": "Pine", 
      "description": "Short description of pine." 
     }, 
     { 
      "id": "a02", 
      "name": "Birch", 
      "description": "Short description of birch." 
     }, 
     { 
      "id": "a03", 
      "name": "Poplar", 
      "description": "Short description of poplar." 
     }], 
     "id": "A", 
     "title": "Cheap", 
     "description": "Short description of category A." 
    }, 
    { 
     "Product": [{ 
      "id": "b01", 
      "name": "Maple", 
      "description": "Short description of maple." 
     }, 
     { 
      "id": "b02", 
      "name": "Oak", 
      "description": "Short description of oak." 
     }, 
     { 
      "id": "b03", 
      "name": "Bamboo", 
      "description": "Short description of bamboo." 
     }], 
     "id": "B", 
     "title": "Moderate", 
     "description": "Short description of category B." 
    }] 
}; 

funzione per trovare

function getObjects(obj, key, val) { 
    var objects = []; 
    for (var i in obj) { 
     if (!obj.hasOwnProperty(i)) continue; 
     if (typeof obj[i] == 'object') { 
      objects = objects.concat(getObjects(obj[i], key, val)); 
     } else if (i == key && obj[key] == val) { 
      objects.push(obj); 
     } 
    } 
    return objects; 
} 

Usa come so:

getObjects(TestObj, 'id', 'A'); // Returns an array of matching objects 

Questo codice serve per selezionare il pezzo corrispondente dalla fonte. Ma quello che voglio è aggiornare l'oggetto sorgente con un nuovo valore e recuperare l'oggetto sorgente aggiornato.

voglio qualcosa di simile

getObjects(TestObj, 'id', 'A', 'B'); // Returns source with updated value. (ie id:'A' updated to id:'B' in the returned object) 

Il mio codice

function getObjects(obj, key, val, newVal) { 
    var newValue = newVal; 
    var objects = []; 
    for (var i in obj) { 
     if (!obj.hasOwnProperty(i)) continue; 
     if (typeof obj[i] == 'object') { 
      objects = objects.concat(getObjects(obj[i], key, val)); 
     } else if (i == key && obj[key] == val) { 
      obj[key] = 'qwe'; 
     } 
    } 
    return obj; 
} 

Questo funziona se io do obj[key] = 'qwe'; ma se cambio il codice in obj[key] = newValue; sua aggiornata come indefinita.

Perché è così?

+2

obj [tasto] = newVal? – Virus721

+0

in altro se condizione giusta? – Okky

+0

Non capisco cosa vuoi fare. Vuoi aggiornare l'oggetto sorgente nello stesso momento in cui ne recuperi un pezzo? oO – Virus721

risposta

7

Hai dimenticato di passare newValue nella chiamata annidata

function getObjects(obj, key, val, newVal) { 
    var newValue = newVal; 
    var objects = []; 
    for (var i in obj) { 
     if (!obj.hasOwnProperty(i)) continue; 
     if (typeof obj[i] == 'object') { 
      objects = objects.concat(getObjects(obj[i], key, val, newValue)); 
     } else if (i == key && obj[key] == val) { 
      obj[key] = 'qwe'; 
     } 
    } 
    return obj; 
} 
+0

Oh! Che incuria da parte mia. Grazie uomo – Okky

1
function getObjects(obj, key, val, newVal) { 
    for (var i in obj) { 
     if (!obj.hasOwnProperty(i)) continue; 
     if (i == key && obj[key] == val) { 
      obj[key] = newVal; 
     } 
    } 
    return obj 
} 

Questo farà l'aggiornamento inplace di un valore trovato con l'newValue (newVal)

+0

Questo non funzionerà se Im salverò in qualcosa in un nested annidato – Okky

1

questo?

function update(obj, key, newVal) { 
    for(var i in obj) { 
     if(typeof obj[i] == 'object') { 
      update(obj[i], key, newVal)); 
     } else if(i === key) { 
      obj[i] = newVal; 
     } 
    } 
    return obj; 
} 
+0

No, è la coppia di valori chiave che la chiave non duplicata può essere di più copie – Okky

Problemi correlati