2013-05-15 27 views
0

我正在試驗數據的深層對象樹,現在我希望我的代碼現在可以分解了。使用Try Catch或If Else來實現性能的JavaScript

很多時候我必須檢查整個分支是否存在以設置或取消設置值。我使用了很多'if else'條件,我正在考慮使用函數。

例如,設置在一個分支爲假的值,我可以有兩個解決方案,如:

function setFalse(root, /* [names]* */) { ... 
    // If root exists, call setFalse() with the rest of arguments. 
    // Else if I only have two arguments : root[arguments[1]] = false ; 
    // Else return. 
... } 

或用try-catch代碼:

function setFalse(root, /* [names]* */) { 
    try { 
     var l = arguments.length, 
      branch = root ; 
     for (var i=1 ; i<l-1 ; i++) // Not taking the last argument. 
      branch = branch[arguments[i]] ; 
     branch[arguments[l-1]] = false ; // With last argument. 
    } 
    catch(e) {} 
} 

第一種方法比清潔劑第二,但它使用遞歸,所以它可能會很沉重。 第二種方法有點骯髒(我認爲),但是執行起來可能更輕?

我必須精確地說,我不在乎整個分支是否存在,我只是想讓它在假如存在的情況下放置。

通常我有4分支深層物體,但它可能更多。 您認爲哪種方法最高效?

回答

0

都沒有。第一個是效率低下,因爲它會創建大量的數組來處理參數,第二個是低效的,因爲錯誤處理通常是一個昂貴的流程控制方式。

使用第二個原則,但檢查的,而不是依靠錯誤處理如果屬性存在於每個層面,:

function setFalse(root /* ,[names] */) { 
    var l = arguments.length, branch = root; 
    for (var i = 1 ; i < l-1 ; i++) { 
    if (!branch.hasOwnProperty(arguments[i])) return; 
    branch = branch[arguments[i]]; 
    } 
    if (branch.hasOwnProperty(arguments[l-1])) { 
    branch[arguments[l-1]] = false; 
    } 
} 

演示:http://jsfiddle.net/Guffa/j6BXc/

+0

太好了!謝謝您的回答。我終於離正確的方法不遠了。 – Tot