2016-12-06 57 views
0

我正在嘗試將'_x'添加到每個對象鍵和'_y'到每個對象值。 這是代碼:如何將char添加到javascript對象鍵和值?

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

基本上你需要新的密鑰而不是舊的,並刪除實際的密鑰。

另一部分是改變一個內部對象,如果需要的話。

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

這是比較容易,如果你將對象轉換爲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), 
 
    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

相關問題