2014-09-30 107 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); 
    } 
}, []); 

要么比可接受的解决方案更具可读性。