2017-03-04 88 views
0

我有一個API返回undescore_case中的響應,並使用lowerCamerlCase。我也使用NodeJS在前端和後端之間進行調解。Javascript將underscore_case轉換爲lowerCamelCase

我想任何類型的JavaScript變量的轉換爲lowerCamelCase,爲此,我寫了這個功能:

function transform(any) { 
    if(Array.isArray(any)) { 
     any.forEach((v, k) => any[k] = transform(v)); 
    } else if(typeof any === "object" && any != null) { 
     Object.keys(any).forEach(key => { 
      let t = key.replace(/_\w/g, (m) => m[1].toUpperCase()); 
      if(t !== key) { 
       any[t] = transform(any[key]); 
       delete any[key]; 
      } 
     }); 
    } 

    return any; 
} 

它的工作原理,但我不知道是否有什麼辦法可以讓它更快。使用

let list = []; 
for(let i = 0; i < 1000; i++) 
    list.push({ 
     some_thing: { 
      aa_bb: 1, 
      bb_cc: 2, 
      cc_dd: 3 
     }, 
     stuff_underscore: "aaa", 
     ordinary: 1 
    }); 

和測試:

我生成這個數據例如

console.time("test"); 
transform(list); 
console.timeEnd("test"); 

那麼,有沒有什麼辦法,使其更快?

+0

如果您自己反序列化(使用'JSON.parse'),則可以在反序列化期間更改密鑰。你是反序列化它還是圖書館爲你做這件事? – JLRishe

+0

這可能更適合CodeReview SE,而不是這裏。沿着這些路線:保持簡單。而不是對參數類型進行條件檢查只是有一個函數可以處理對象,然後將它映射到它們的數組上。 –

+0

我自己使用'JSON.parse'。 – Amit

回答

1

您可以使用JSON.parse的第二個參數在反序列化期間執行此轉換。這可能會節省您的時間相比,反序列化後走的結果:

var myJson = '[{ "aa_aa": 1, "bb_bb": 2 }, { "cc_cc": 3 }]'; 
 

 
var obj = JSON.parse(myJson, (key, value) => { 
 
    if (typeof value === 'object' && !Array.isArray(value)) { Object.keys(value).forEach(keyInner => { 
 
     let t = keyInner.replace(/_\w/g, m => m[1].toUpperCase()); 
 
     if (t !== keyInner) { 
 
     value[t] = value[keyInner]; 
 
     delete value[keyInner]; 
 
     } 
 
    }); 
 
    } 
 

 
    return value; 
 
}); 
 

 
console.log(obj);

+0

看起來像一個偉大的解決方案。 – Amit

0

你正在做的(至少)三樣東西是出了名的慢:在一個循環中重複的條件檢查,正則表達式和刪除對象鍵。

const transform = obj => { 
    const keys = Object.keys(obj); 
    const newKeys = keys.map(k => { 
    const [first, ...rest] = k.split('_'); 
    return first + rest.reduce((acc, s) => { 
     return acc + s[0].toUpperCase() + s.slice(1); 
    }, ''); 
    }); 
    return newKeys.reduce((acc, k, i) => { 
    acc[k] = obj[keys[i]]; 
    return acc; 
    }, {}); 
}; 

現在我們正在使用的字符串函數,而不是regexs,構建一個新的對象,而不是修改一個到位,而不是在做轉換功能的任何條件檢查(這些你怎麼稱呼它之前應該發生)。

+0

這看起來像是朝着正確方向邁出的一步,但它如何解決數組或對象內數組的問題? – Amit

+0

你是說''.split'和'.reduce'的複雜混亂比'RegEx#replace'快嗎?這當然更加冗長。你是否說從頭開始創建一個全新的對象會更快地刪除和添加屬性?此外,這不符合OP的要求,因爲它不處理任何屬性值。 – JLRishe

+0

對於數組,您只需將其映射到數組上即可。對於嵌套而言,你使用遞歸的想法是正確的,但是你會想把它移入一個獨立的函數,它調用我寫的那個函數。這個概念被稱爲單一可抵償性原則。 –