2013-08-01 28 views
5

で更新私は見つけ、ネストされたJSONオブジェクト

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; 
} 

使用などを見つけることがsJhonny's Question

データサンプル

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." 
    }] 
}; 

機能からJSONオブジェクトから必要な部分を見つけるために、このコードを使用しましたso:

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

このコードは、ソースから一致する部分を選択することです。しかし、私が望むのは、新しい値でソースオブジェクトを更新し、更新されたソースオブジェクトを取得することです。

は、私は私がobj[key] = 'qwe';を与える場合、これは動作します

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

私のコード

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; 
} 

のような何かをしたいが、私はobj[key] = newValue;にコードを変更した場合、そのは未定義のように更新します。

なぜそうですか?

+2

OBJ [キー] = newValにしてnewValueにを渡すのを忘れて?他の場合は – Virus721

+0

で条件が正しい? – Okky

+0

あなたは何をしたいのか分からない。ソースオブジェクトを取得するのと同時にソースオブジェクトを更新しますか? oO – Virus721

答えて

7

あなたは、ネストされたコール

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

ああ!どのように私の不注意。ありがとう – 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 
} 

これは、newValueに(newValに)

+0

入れ子になっているjsonに何かに保存しようとするとうまくいきません – Okky

1

これで見つかった値のインプレース更新をしますか?

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

いいえ、重複していないキー値のペアです。 – Okky

関連する問題