2016-11-25 29 views
3

私は非常にシンプルなjsonを持っていますが、各ブロックにはこのようなものがあります。jsonキーの名前を反復的に変更

var json = { 
"name": "blabla" 
"Children": [{ 
     "name": "something" 
     "Children": [{ ..... }] 
} 

など。私はどのくらいの数の子供たちが各子供の中に再帰的にいるのか分かりません。

var keys = Object.keys(json); 

for (var j = 0; j < keys.length; j++) { 
    var key = keys[j]; 
    var value = json[key]; 
    delete json[key]; 
    key = key.replace("Children", "children"); 
    json[key] = value; 
} 

次に、すべての「子」キーを小文字の「子」に置き換えたいと思います。次のコードは、最初の深さでのみ動作します。これを再帰的に行うにはどうすればよいですか?

+3

ハックではなく、あなたが後にしている答えが、方法について: 'VAR S = JSON.stringify(JSON)。 var t = s。置き換える(/ "子"/g、 ""子 "'); var newJson = JSON.parse(t); '? – Bardy

+0

ありがとう@ベルディ。魅力のように働いた – Elsendion

+0

よろしく! probs! :) – Bardy

答えて

2

可能な解決策:

var s = JSON.stringify(json); 
var t = s.replace(/"Children"/g, '"children"'); 
var newJson = JSON.parse(t); 
  • 長所:このソリューションでは、わずか3行であること、非常に簡単です。
  • 短所:可能性不要な副作用があり、検討してください。

    var json = { 
        "name": "blabla", 
        "Children": [{ 
        "name": "something", 
        "Children": [{ ..... }] 
        }], 
        "favouriteWords": ["Children","Pets","Cakes"] 
    } 
    

をソリューションが"Children"すべてのインスタンスを置き換え、そうfavouriteWords配列のエントリにも希望ではないが、はプロパティ名であるにもかかわらず、置き換えられる。プロパティ名以外の場所に単語が表示される可能性がない場合は、これは問題ではありませんが、場合によっては覚えておく価値があります。

3

あなたは、単にこのような再帰関数作成することができますので、それは、入力構造がかなり明確に定義されているになります。ここでは

function transform(node) { 
 
    return { 
 
    name: node.name, 
 
    children: node.Children.map(transform) 
 
    }; 
 
} 
 

 

 
var json = { 
 
    "name": "a", 
 
    "Children": [{ 
 
    "name": "b", 
 
    "Children": [{ 
 
     "name": "c", 
 
     "Children": [] 
 
    }, { 
 
     "name": "d", 
 
     "Children": [] 
 
    }] 
 
    }, { 
 
    "name": "e", 
 
    "Children": [] 
 
    }] 
 
}; 
 

 
console.log(transform(json));

1

をrecursivlyそれを行うことができます関数です。

0:
function convertKey(obj) { 
    for (objKey in obj) 
    { 

     if (Array.isArray(obj[objKey])) { 
      convertKey[objKey].forEach(x => { 
       convertKey(x); 
      }); 

     } 

     if (objKey === "Children") { 
      obj.children = obj.Children; 
      delete obj.Children; 
     } 
    } 
} 

そして、ここでは、これを行うための、より一般的な方法であります

function convertKey(obj, oldKey, newKey) { 
    for (objKey in obj) 
    { 

     if (Array.isArray(obj[objKey])) { 
      obj[objKey].forEach(objInArr => { 
       convertKey(objInArr); 
      }); 
     } 

     if (objKey === oldKey) { 
      obj[newKey] = obj[oldKey]; 
      delete obj[oldKey]; 
     } 
    } 
} 

convertKey(json, "Children", "children"); 
0

受け入れられた回答と@Tamasの回答には、若干の問題があります。

彼が指摘しているように、@バーディの答えでは、あなたの値のいずれかに「子供」という言葉が問題を起こすと問題が発生します。

@Tamasでは、1つの問題は、名前&という名前以外の他のプロパティが削除されることです。また、Childrenプロパティを前提としています。子供の財産がすでにchildrenで、Childrenでない場合はどうなりますか?

少し修正した@Tamasを使用すると、落とし穴を避けることができます。たぶん

function transform(node) { 
 
    if (node.Children) node.children = node.Children; 
 
    if (node.children) node.children = node.children.map(transform); 
 
    delete node.Children; 
 
    return node; 
 
} 
 

 

 
var json = { 
 
    "name": "a", 
 
    "Children": [{ 
 
    "age": 13, 
 
    "name": "b", 
 
    "Children": [{ 
 
     "name": "Mr Bob Chilren", 
 
     "Children": [] 
 
    }, { 
 
     "name": "d", 
 
     "age": 33, //other props keep 
 
     "children": [{ 
 
     "name": "already lowecased", 
 
     "age": 44, 
 
     "Children": [{ 
 
      "name": "now back to upercased", 
 
      "age": 99 
 
     }] 
 
     }] //what if were alrady lowercased? 
 
    }] 
 
    }, { 
 
    "name": "e", 
 
    //"Children": [] //what if we have no children 
 
    }] 
 
}; 
 

 
console.log(transform(json));

関連する問題