2016-07-26 48 views
2

我有一個未知的數水平和類型(數組,對象,字符串)的目的,在這裏是一個例子:使用Javascript - 遍歷深嵌套對象和改變某些未知值

var data = { 
    ffs: false, 
    customer: { 
     customer_id: 1544248, 
     z_cx_id: '123456', 
    }, 
    selected_items: { 
     '3600196': [{ 
      id: 4122652, 
      name: 'Essential Large (up to 8\'x10\')', 
      selected: true 
     }] 
    }, 
    service_partner: { 
     id: 3486, 
     name: 'Some String', 
     street: '1234 King St.', 
    }, 
    subject: 'Project-2810191 - Orange Juice Stain (Rug)', 
    description: 'Product Type: \n\nIssue: (copy/paste service request details here)\n\nAction Required:', 
} 

我不得不通過每個屬性循環中使用普通的JavaScript和消毒具有每串的'有‘’(用於在Postgres的查詢使用),我用下面的代碼進行更改:

val = val.replace(/'/g, "''"); 

,我可以循環通過對象並用此顯示它們,儘管這可能不是最好的解決方案:

function iterObj(obj) { 
    for (var key in obj) { 
    console.log(key + ': ' + obj[key]); 
    if (obj[key] !== null && typeof obj[key] === "object") { 
     // Recurse into children 
     iterObj(obj[key]); 
    } 
    } 
} 

iterObj(data); 

問題是我不知道如何實際執行消毒部分和更新原始數據數組,因爲這是循環的。

我發現很多人問類似的問題,但不能完全得到他們的答案在我的情況下工作。

任何幫助表示讚賞。

+0

你確定你需要這個?大概你正在使用的圖書館已經建立了一些衛生邏輯 – eltonkamami

+0

所以應該這樣:'8 \'x10 \''變成'8 \「x10 \」'? – KevBot

+0

是的不幸。 – Mankind1023

回答

3

您可以檢查一個對象並再次調用遞歸。

function iter(o) { 
 
    Object.keys(o).forEach(function (k) { 
 
     if (o[k] !== null && typeof o[k] === 'object') { 
 
      iter(o[k]); 
 
      return; 
 
     } 
 
     if (typeof o[k] === 'string') { 
 
      o[k] = o[k].replace(/'/g, "''"); 
 
     } 
 
    }); 
 
} 
 

 
var data = { ffs: false, customer: { customer_id: 1544248, z_cx_id: '123456' }, selected_items: { '3600196': [{ id: 4122652, name: 'Essential Large (up to 8\'x10\')', selected: true }] }, service_partner: { id: 3486, name: 'Some String', street: '1234 King St.' }, subject: 'Project-2810191 - Orange Juice Stain (Rug)', description: 'Product Type: \n\nIssue: (copy/paste service request details here)\n\nAction Required:' }; 
 

 
iter(data); 
 
console.log(data);

+1

這樣做,謝謝! – Mankind1023

1

爲什麼不是整個對象轉換爲JSON,然後用"替換所有'的?然後,您可以簡化整個操作,而無需進行遞歸。

var data = {ffs: false, customer: {customer_id: 1544248, z_cx_id: '123456',}, selected_items: {'3600196': [{id: 4122652, name: 'Essential Large (up to 8\'x10\')', selected: true}]}, service_partner: {id: 3486, name: 'Some String', street: '1234 King St.',}, subject: 'Project-2810191 - Orange Juice Stain (Rug)', description: 'Product Type: \n\nIssue: (copy/paste service request details here)\n\nAction Required:',}; 
 

 
data = JSON.stringify(data); 
 
// or replace with two ' or whatever else 
 
data = data.replace(/'/g, '\\"'); 
 
data = JSON.parse(data); 
 

 
console.log(data);