Как отсортировать данные нескольких столбцов в многомерном массиве? - PullRequest
0 голосов
/ 24 января 2019

Я работаю с кодом Javascript, где у меня есть массив, как показано ниже:

Массив:

[
    ["2015-08-09", 1.2, 1.20, 2.1],
    ["2015-08-10", 1.2, 1.21, 2.11],
    ["2015-08-11", 1.2, 0.99, 2.20],
    ["2015-10-29", 1.2, 1.12, 2.22],
    ["2015-09-10", 1.21, 1.19, 2.00]
]

Мой требуемый результат::

[
    ["2015-08-09", 1.20, 1.20, 2.10],
    ["2015-08-10", 1.20, 1.21, 2.11],
    ["2015-08-11", 1.20, 0.99, 2.20],
    ["2015-10-29", 1.20, 1.12, 2.22],
    ["2015-09-10", 1.21, 1.19, 2.00]
]

Поскольку массив является 3-мерным, я хочу отсортировать его по column 1 и 2, поэтому сначала примените к столбцу 1 по возрастанию, а затем к столбцу 2 (по возрастанию /по убыванию).

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 25 января 2019

Я также столкнулся с той же проблемой и нашел хорошее решение для сортировки данных нескольких столбцов в многомерном массиве.

Проверьте код ниже

(function() {
      function deepsort(){
    var i, order= arguments, L= order.length, tem;
    return a.sort(function(a, b){
        i= 0;
      
        while(i < L){
          
            tem= order[i++];
          var res = tem.split("_");
            var ao= a[res[0]] || 0, bo= b[res[0]] || 0;
            if(ao== bo) continue;
           
          if(res[1] == "ASC"){
            return ao > bo? 1: -1;
          }
          if(res[1] == "DESC"){
             return ao < bo? 1: -1;
          }
        }
        return 0;
    });
}

var a= [
    ["2015-08-09", 1.2, 1.20, 2.1],
    ["2015-08-10", 1.2, 1.21, 2.11],
    ["2015-08-11", 1.2, 0.99, 2.20],
    ["2015-10-29", 1.2, 1.12, 2.22],
    ["2015-09-10", 1.21, 1.19, 2.00]
];
document.write(deepsort(1+"_ASC",2+"_ASC"));
// for better result view check console log
console.log(deepsort(1+"_ASC",2+"_ASC"))
//console.log(a.deepsort(1))
    
    })();
0 голосов
/ 24 января 2019

Просто объедините требуемый порядок, взяв дельту каждого столбца.

var array = [["2015-08-09", 1.2, 1.2], ["2015-08-10", 1.2, 1.21], ["2015-08-11", 1.2, 0.99], ["2015-10-29", 1.2, 1.12], ["2015-09-10", 1.21, 1.19]];

array.sort((a, b) => a[1] - b[1] || a[2] - b[2]);

console.log(array.map(a => a.join('  ')));
0 голосов
/ 24 января 2019

Здесь у вас есть другой подход, использующий более похожее математическое выражение в функции сравнения сортировки, а также форматирует выходные данные, как вы ожидали:

const input = [
    ["2015-08-09", 1.2, 1.20, 2.1],
    ["2015-08-10", 1.2, 1.21, 2.11],
    ["2015-08-11", 1.2, 0.99, 2.20],
    ["2015-10-29", 1.2, 1.12, 2.22],
    ["2015-09-10", 1.21, 1.19, 2.00]
];

// First, we use map() to clone the array so we don't change
// the original, and also to format the numbers as you expect.

let res = input.map(
  ([a, b, c, d]) => [a, b.toFixed(2), c.toFixed(2), d.toFixed(2)]
);

// Now we sort the new array using a more-like mathematical expression.

res.sort((x, y) =>
{
    let n = x[1] - y[1], m = x[2] - y[2];
    return n +  m * (n === 0);
});

console.log(res);
0 голосов
/ 24 января 2019

На самом деле ваш массив является 2-мерным.Вы можете отсортировать его так же, как и одномерный массив:

const data = [
  [ "2015-08-09", 1.2, 1.2], 
  [ "2015-08-10", 1.2, 1.21], 
  [ "2015-08-11", 1.2, 0.99],
  [ "2015-10-29",  1.2, 1.12] , 
  [ "2015-09-10",  1.21, 1.19]   
]

function sort(a, b) {
  const col1 = new Date(a[0]) - new Date(b[0]);
  if (col1 === 0) {
    return a[1] - b[1];
  }
  return col1;
}

console.log(data.sort(sort))

В приведенном выше примере мы сортируем сначала по первому полю во внутреннем массиве.Если значения равны - тогда мы сравниваем второе поле внутреннего массива.

...