2014-02-27 29 views
0

我想優化我的代碼CPUmemory消耗。在我的函數中,我需要將兩個對象數組合併到一個數組中。與UNION一樣,數組中所有對象的所有id都必須是唯一的。我不想使用第三方庫,如Underscore如何優化兩個對象數組的合併?

這是我的函數:

var presentation_slides = [ 
    { 
    "id": "2", 
    "type": "results" 
    }, 
    { 
    "id": "1", 
    "type": "slide" 
    }, 
    { 
    "id": "4", 
    "type": "questions" 
    }] 

for(var i = 0; i < new_length; i++) { 
    var my_slide = presentation_slides.filter(function (obj) { return obj.id == i })[0] 
    if(!my_slide) { 
     presentation_slides.push({"id": i, "type": "slide"}); 
    } 
} 

OUTPUT:

var presentation_slides = [ 
    { 
    "id": "2", 
    "type": "results" 
    }, 
    { 
    "id": "1", 
    "type": "slide" 
    }, 
    { 
    "id": "4", 
    "type": "questions" 
    }, 
    { 
    "id": 0, 
    "type": "slide" 
    }, 
    { 
    "id": 3, 
    "type": "slide" 
    }] 

謝謝!

編輯:

比較一些測試:http://jsperf.com/how-can-be-optimized-merging-of-two-arrays-of-objects

+0

也許一個愚蠢的問題,但什麼是數組的來源是什麼?這可以解決服務器端? –

+1

在你的代碼中,我看到只有一個數組在其中添加新對象,也許用更準確的代碼重寫了你的問題? –

回答

1

你可以用some代替filter,我添加了一個code snipetjsperf,這是更快...

檢查此:.....jsperf.....

for (var i = 0; i < new_length; i++) { 

    if (!presentation_slides.some(function(obj) { return obj.id == i})) 
     presentation_slides.push({ "id": i, "type": "slide" }); 
} 
+0

非常好!我需要檢查'.filter()'和'.some()'! – Kamil

0

如果你只是想合併兩個數組,那麼你可以使用Array.concat()

var array1 = [ 
    { id: 1, type: "orange" }, 
    {id: 3, type: "apple" }, 
    { id: 4, type: "banana" } ], 
    array2 = [ 
     { id: 8, type: "strawberry" }, 
     { id: 9, type: "raspberry" } 
    ]; 

var array3 = array1.concat(array2); 

array3將包含所有從array1array2的元素。

這不會檢查ID是否是唯一的。

+0

謝謝,但它必須是獨一無二的。這就是我提到工會的原因。 – Kamil

+0

@KamilMaraz我看到 - 我不明白'UNION' - 我不能熟悉它的原始編程語言。 – starbeamrainbowlabs

+0

感謝您的編輯。 – Kamil

0

也,逆循環是快一點:

var i = new_length; 
while (i--) { 
    if (!presentation_slides.some(function(obj) { return obj.id == i })) { 
     presentation_slides.push({ "id": i, "type": "slide" }); 
    } 
} 

檢查這個...jspref...

+0

這個概念我已經嘗試過很多次了,但是在chrome中很少遇到這種情況。根據我的經驗,即使在您創建的jsperf測試中,反向循環速度也較慢。 – Kamil

+0

是的!!!!!,當我加入並運行反向循環到jsperf時,它有點快,但現在,它慢一點...但我認爲'反向循環'有點快:D –

+0

我再次運行它,這次'反向循環'更快,我拍了一個屏幕截圖...檢查此:http://tinypic.com/r/e05z60/8 –