2016-12-06 4 views
0

すべてのオブジェクトキーに'_x'を追加しようとしています。すべてのオブジェクト値に'_y'を追加しようとしています。 これはコードです:javascriptオブジェクトのキーと値にcharを追加するには?

var data = { 
    "glossary": { 
    "title": "example glossary", 
    "GlossDiv": { 
     "title": "S", 
     "GlossList": { 
     "GlossEntry": { 
      "ID": "SGML", 
      "SortAs": "SGML", 
      "GlossTerm": "Standard Generalized Markup Language", 
      "Acronym": "SGML", 
      "Abbrev": "ISO 8879:1986", 
      "GlossDef": { 
      "para": "A meta-markup language, used to create markup languages such as DocBook.", 
      "GlossSeeAlso": "GMLXML" 
      }, 
      "GlossSee": "markup" 
     } 
     } 
    } 
    } 
} 

function treee(data) { 
    Object.keys(data).map(function (key) { 
    if(Object.keys(data[key]).length == 0){ 
     data[key] = {[key + "_x"]: data[key] + "_y"}; 
    } 
    else{ 
     data[key] = { [key + "_x"]: treee(data[key]) }; 
    } 
    }); 
} 

それが動作していないと私は理由を知りません。何が間違っているのか教えていただけますか?

+1

[JSON](http://json.org/)は文字列です。文字列がない場合は、JSONではありません。オブジェクトや配列のような何か違うものです。 –

+0

JSON.parse ...どこにも表示されません – zerohero

+0

**タイトルを**問題を説明するものに変更してください。 – vsync

答えて

2

基本的に古いキーの代わりに新しいキーが必要で、実際のキーを削除する必要があります。

もう1つの部分は、必要に応じて内側のオブジェクトを変更することです。これは、あなたがJSONにオブジェクトを変換する場合、行う、文字列置換を使用する方が簡単です

function treee(data) { 
 
    Object.keys(data).map(function (key) { 
 
     if (data[key] && typeof data[key] === 'object') { 
 
      treee(data[key]); 
 
     } 
 
     data[key + '_x'] = typeof data[key] === 'string' ? data[key] + '_y' : data[key]; 
 
     delete data[key]; 
 
    }); 
 
} 
 

 
var data = { glossary: { title: "example glossary", GlossDiv: { title: "S", GlossList: { GlossEntry: { ID: "SGML", SortAs: "SGML", GlossTerm: "Standard Generalized Markup Language", Acronym: "SGML", Abbrev: "ISO 8879:1986", GlossDef: { para: "A meta-markup language, used to create markup languages such as DocBook.", GlossSeeAlso: "GMLXML" }, GlossSee: "markup" } } } } }; 
 

 
treee(data); 
 
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

こんにちは、おかげで答えが分かりました。 'key'でhttpリクエストを送信するように、' _x'の代わりに答えを受け取ります。あなたは助けてくれますか? – theCode

+0

@theCode、別の質問を追加してください。 –

+0

大変申し訳ございません。 – theCode

2

var data = { "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": "GMLXML" }, "GlossSee": "markup" } } } } } 
 

 
var jsonString = JSON.stringify(data), 
 
    replacedValues = jsonString 
 
     .replace(/([\w.])"/g, '$1_y"') // Add _y to all strings in there. 
 
     .replace(/_y":/g, '_x":')  // Replace _y with _x for all keys. 
 
    newData = JSON.parse(replacedValues); 
 

 
console.log(newData);

別のオプションを使用することです鍵を置き換える正規表現を使用して、reviver関数を使ってt JSONを解析するとき、彼は、値:

var data = { "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": "GMLXML" }, "GlossSee": "markup" } } } } } 
 

 
var jsonString = JSON.stringify(data) 
 
     .replace(/":/g, '_x":'); // Add _x to all keys. 
 

 
var newData = JSON.parse(jsonString, function(key, val){ 
 
    if(typeof val === 'string')  // For every value, if the value is a string 
 
     return val + '_y';   // Add `_y` 
 
    return val;      // Otherwise, just return the value. 
 
}); 
 

 
console.log(newData);

+0

downvotesとは何ですか?確かに、それは「最もクリーンな」解決策ではありませんが、OPが望んでいるものとまったく同じです。 – Cerbrus

+0

dv、私からではなく、あなたの試みは静かです。:) –

+0

@NinaScholz:確かに、それは独特ですが、それは答えをdownvoteする理由ですか?コードは... – Cerbrus

関連する問題