2013-02-17 65 views
0

請閱讀:我知道這感覺就像堆棧溢出已被回答的那種問題,但我發誓我找不到一個好的答案。 Besides, marking this as "Possible duplicate" would be too meta!從矩陣中刪除重複的行javascript

我具有的值的以特定的順序的矩陣(在JavaScript):

[[1,2], [1,2], [3,4], [5,6 ] [5,6]]

但是我最近才知道Google charts crashes when there are identical rows。我需要刪除重複項;然而,陣列相當大,我無法承受天真實施的二次時間。

通常情況下,如果行是可散列的,我會將它們添加到字典{ }以查看我已經看到的;但是,JavaScript不允許散列數組。

什麼是最好的方法?我想我可以將每行的數組轉換爲一個字符串並將其用作關鍵字,但是這感覺像是一個非常骯髒(並且可能很慢)的黑客攻擊。我真的很喜歡你的建議。

+0

當你「按特定順序」說,這是否意味着你知道數組進行排序?如果是這樣,排序順序是什麼? – 2013-02-17 19:06:19

+0

你的數組來自哪裏?你能在創作上做到這一點嗎? – 2013-02-17 19:07:02

+0

@AbrahamP它沒有排序(它是從XML文件中提取的)。保持當前訂單非常重要,因爲它不一定是一個函數,所以它有時可能會向後移動。 – user 2013-02-17 19:09:02

回答

0

我認爲內存使用會成爲一個問題,因爲數組相當大,所以這是一個或多或少的算法。垮臺是我們必須進行昂貴的排序操作,這取決於大小,可能會很耗時。這種算法可以通過使用內存摺衷而不是這種方法來顯着改善。它遵循:

  1. 當前位置添加到陣列

    for(var i = 0; i < arr.length;i++){ 
        arr[i].push(i); 
    } 
    
  2. 排序數組的結尾。

    arr.sort(); 
    
  3. 查找並刪除dup條目。

    outer: 
    for(var i = 0; i<arr.length-1; i++){ 
        for(var j = 0; j<arr[i].length-1; j++){ 
        if(arr[i][j] != arr[i+1][j]){ 
         continue outer; 
        } 
        } 
        arr.splice(i,1); 
        console.log("Found it!" + i); 
    } 
    
  4. 度假村陣列回到原地。

    arr.sort(function(a,b){ 
        if (a[a.length-1] < b[a.length-1]) 
        return -1; 
        if (a[a.length-1] > b[a.length-1]) 
        return 1; 
        return 0; 
    }); 
    
  5. 刪除添加的元素。

    for(var i = 0; i < arr.length; i++){ 
        arr[i].pop(); 
    }