2014-09-30 142 views
2

我有一個2D陣列象下面這樣:JavaScript的2D陣列 - 排序和合並

1230 | this is a test 
1278 | my new test 
1230 | test2 
7654 | testing... 

我要變換的陣列,使得值是在第一列中的獨特和第二列存儲與相關聯的所述級聯文本那個特定的價值。見下面的例子。

1230 | this is a test -- test2 
1278 | my new test 
7654 | testing... 

我知道我應該先對數組的第一列進行排序,然後進行合併。

這裏是第一列排序的數組的代碼:我有點失去了有關如何執行合併

var x = exp_arr.sort(function(a,b){ return a[0] > b[0] ? 1 : -1; }); 
alert(x); 

。您的建議是最歡迎的

+0

**通過將項目複製到新數組(如果「id」不存在並且如果它合併)來合併**。 **排序**傳遞自定義比較函數的結果數組。 – Prusse 2014-09-30 15:41:02

回答

4

可以使用reduce命令,像這樣:

var array = [[1230, "this is a test"], [1278, "my new test"], [1230, "test2"], [7654, "testing..."]]; 

var result = 
    array.reduce(function(ob, ar) { 
       if (!(ar[0] in ob.nums)) { 
        ob.nums[ar[0]] = ar 
        ob.result.push(ar); 
       } else 
        ob.nums[ar[0]][1] = (ob.nums[ar[0]][1]) + " -- " + ar[1]; 

       return ob 
      }, {nums:{}, result:[]}).result 
    .sort(function(a,b) { 
     return a[0] - b[0]; 
    }); 

Fiddle here

Reduce documentation here

+0

非常感謝。鏈接到文檔確實非常有用:) – Kim 2014-09-30 15:52:04

1

你可以這樣做:

var x = exp_arr.sort(function(a,b){ return a[0] > b[0] ? 1 : -1; }).filter((function() { 
    var prev = [null]; 
    return function(item) { 
     if(prev[0] === item[0]) { 
      prev[1] += ' -- ' + item[1]; 
      return false; 
     } 
     prev = item; 
     return true; 
    }; 
}())); 

說明:
過濾函數接受一個事實,即數組已經排序的優勢。因此,每個元素都與前一個元素進行比較(因此封閉被用於保存前一個元素)。如果前一個元素具有相同的ID,我們將該字符串追加到前一個元素。

這裏是jsfiddle-demo

1

第一組陣列元件具有相同的第一值到對象的鍵是第一元件,和值是第二元件的陣列:

groups = array.reduce(function(result, elt) { 
    result[elt[0]] = (result[elt[0]] || []).concat(elt[1]); 
    return result; 
}); 

然後該對象映射回通過將每個鍵的陣列的成員與--結合成陣列。

Object.keys(groups).map(function(key) { return [key, groups[key].join(' -- '); }) 

或者,採取葉出@ friedi的書,以第一排數組的優勢,但使用reduce代替filter,這是稍微簡單,因爲它意味着我們並不需要一個IIFE關閉周圍上一項:

array.sort(sortfunc).reduce(result, item) { 
    var prev = result[result.length-1] || []; 
    if (prev[0] === item[0]) { 
     prev[1] += " -- " + item[1]; 
    } else { 
     result.push(item); 
    } 
}, []); 

要麼比可接受的解決方案更具可讀性。