按两个字段对数组进行排序

时间:2017-07-12 10:40:17

标签: javascript multidimensional-array

我试图总结这个无序的二维数组:

[
  [3.0, 1.0, 4.0], 
  [2.0, 1.0, 1.0], 
  [1.0, 1.0, 6.0], 
  [1.0, 1.0, 1.0], 
  [3.0, 2.0, 5.0], 
  [2.0, 2.0, 1.0], 
  [3.0, 1.0, 1.0],
  [1.0, 1.0, 4.0],
  [1.0, 2.0, 3.0],
  [3.0, 1.0, 2.0],
  [2.0, 1.0, 1.0],
  [2.0, 2.0, 2.0]
]

我可以通过第一列和第二列来订购它,如下所示:

[
[1.0, 1.0, 6.0], 
[1.0, 1.0, 1.0], 
[1.0, 1.0, 4.0], 
[1.0, 2.0, 3.0], 
[2.0, 1.0, 1.0], 
[2.0, 1.0, 1.0], 
[2.0, 2.0, 1.0], 
[2.0, 2.0, 2.0], 
[3.0, 1.0, 4.0], 
[3.0, 1.0, 1.0], 
[3.0, 1.0, 2.0], 
[3.0, 2.0, 5.0]
]

使用此代码:

function sortData(myArr) {

  // sort on second column, asc
  myArr.sort(function (element_a, element_b) {
    return element_a[1] - element_b[1];
  });
  // sort on first column, asc
  myArr.sort(function (element_a, element_b) {
    return element_a[0] - element_b[0];
  });

  return myArr;
}

最终,下面的结果是我想要获得的结果(第三列的总和,按升序排列第1和第2列):

[
[1.0, 1.0, 11.0], 
[1.0, 2.0, 3.0], 
[2.0, 1.0, 2.0], 
[2.0, 2.0, 3.0], 
[3.0, 1.0, 7.0], 
[3.0, 2.0, 5.0]
]

3 个答案:

答案 0 :(得分:1)

您可以先对数据进行排序,然后使用forEach()循环按前两个元素分组,并将第三个元素加起来。



var data = [[3,1,4],[2,1,1],[1,1,6],[1,1,1],[3,2,5],[2,2,1],[3,1,1],[1,1,4],[1,2,3],[3,1,2],[2,1,1],[2,2,2]]

data.sort(function(a, b) {
 return a[0] - b[0] || a[1] - b[1]
})

var result = [];
data.forEach(function(e) {
  var key = e[0].toString() + e[1].toString();
  if(!this[key]) result.push(this[key] = e.slice())
  else this[key][2] += e[2]
}, {})

console.log(JSON.stringify(result))




答案 1 :(得分:0)

浏览已排序的数组,创建一个新的总和数组 当第一列或第二列变得不同时创建一个新元素,或者只要这些列保持不变,就添加到当前元素。

答案 2 :(得分:-1)

使用Array#reduce:



let arr = [
  [3.0, 1.0, 4.0], 
  [2.0, 1.0, 1.0], 
  [1.0, 1.0, 6.0], 
  [1.0, 1.0, 1.0], 
  [3.0, 2.0, 5.0], 
  [2.0, 2.0, 1.0], 
  [3.0, 1.0, 1.0],
  [1.0, 1.0, 4.0],
  [1.0, 2.0, 3.0],
  [3.0, 1.0, 2.0],
  [2.0, 1.0, 1.0],
  [2.0, 2.0, 2.0]
]


let res = Object.values(arr.reduce((a, c)=>{
  let key = c.slice(0,2).join('|'); 
  if(!a[key]){
    a[key] = c
  }else{
     a[key][2] += c[2]
  }
  return a
},{})).sort((a, b)=>{
   return a[0]-b[0] || a[1] - b[1]
});


console.log(JSON.stringify(res))




基本理论是使用前2个值来创建对象键。如果该密钥不存在,则创建一个新的当前数组作为值....如果它已经存在并且每个的最后一个值