【问题标题】:sort array multidimensional javascript排序数组多维javascript
【发布时间】:2017-10-10 18:10:50
【问题描述】:

我必须对此进行排序: 我从两个不同的select 查询中获取数据库中的数据,我必须按mpriority 和mdate 对它们进行排序。

我知道如何对对象数组进行排序,但我不能使用 object 或 object.key

    var allocations = new Array(); 
    allocations[0] =
    [   qtA =  15,
        mdata=  '1234',
        mid =  '234234234',
        qtyToDoTemp=  11,
        mpriority=  5,
        mdate=  new Date('2017-04-27 11:26:02.147'),
    ];

allocations[1] =
    [
        qtA= 13,
        mdata=  '1234',
        mid =  '234234234',
        qtyToDoTemp= 11,
        mpriority= 5,
        mdate= new Date('2016-10-07 00:00:00.000'),
    ];

allocations[2] =
    [
        qtA= 16,
        mdata=  '1234',
        mid =  '234234234',
        qtyToDoTemp= 11,
        mpriority= 4,
        mdate= new Date('2017-04-27 11:26:02.147'),
    ];

allocations[3] =
    [
        qtA= 95,
        mdata=  '1234',
        mid =  '234234234',
        qtyToDoTemp= 11,
        mpriority= 1,
        mdate= new Date('2016-10-06 00:00:00.000'),
    ];

allocations[4] =
    [
        qtA= 75,
        mdata=  '1234',
        mid =  '234234234',
        qtyToDoTemp= 11,
        mpriority= 8,
        mdate= new Date('2017-02-20 12:41:34.903'),
    ];

allocations[5] =
    [
        qtA= 45,
        mdata=  '1234',
        mid =  '234234234',
        qtyToDoTemp= 11,
        mpriority= 0,
        mdate= new Date('2017-04-27 11:26:02.147'),
    ];

排序函数应该首先查看mpriority - 如果两个值相同,则检查mdate

我觉得应该是这样的

var sortOptions = {
    byPriorityAndDate: function (a, b) {
        return (b.mpriority - a.mpriority) || (a.mdate - b.mdate);
    },
}

以及如何检查我正在处理的 js 版本?

【问题讨论】:

  • 您的排序功能遇到了什么问题?注意:(1)您的数组定义的语法没有按照您的想法执行。 (2) 要了解 JavaScript 的版本,请阅读浏览器的版本发布内容。另见this simple check
  • 这是伪代码还是什么?因为看起来你正在尝试创建一个对象而不是一个数组

标签: javascript arrays sorting multidimensional-array


【解决方案1】:

你有数组数组,而不是对象数组。

我建议您将数组数组转换为对象数组,像这样实例化每个元素:

allocations[0] = {
    qtA:  15,
    mdata:  '1234',
    mid:  '234234234',
    qtyToDoTemp:  11,
    mpriority:  5,
    mdate:  new Date('2017-04-27 11:26:02.147'),
};

这样你编写的比较函数应该可以工作

另外,我建议您阅读Compare two dates with JavaScript 以了解您想要哪种比较

无论如何,这种排序功能适用于您的情况:

allocations = allocations.sort((a, b) => {
   if (a[4] === b[4]) {
        return a[5].getTime() - b[5].getTime();
   }

   return a[4] - b[4];
})

var allocations = new Array(); 
    allocations[0] =
    [   qtA =  15,
        mdata=  '1234',
        mid =  '234234234',
        qtyToDoTemp=  11,
        mpriority=  5,
        mdate=  new Date('2017-04-27 11:26:02.147'),
    ];

allocations[1] =
    [
        qtA= 13,
        mdata=  '1234',
        mid =  '234234234',
        qtyToDoTemp= 11,
        mpriority= 5,
        mdate= new Date('2016-10-07 00:00:00.000'),
    ];

allocations[2] =
    [
        qtA= 16,
        mdata=  '1234',
        mid =  '234234234',
        qtyToDoTemp= 11,
        mpriority= 4,
        mdate= new Date('2017-04-27 11:26:02.147'),
    ];

allocations[3] =
    [
        qtA= 95,
        mdata=  '1234',
        mid =  '234234234',
        qtyToDoTemp= 11,
        mpriority= 1,
        mdate= new Date('2016-10-06 00:00:00.000'),
    ];

allocations[4] =
    [
        qtA= 75,
        mdata=  '1234',
        mid =  '234234234',
        qtyToDoTemp= 11,
        mpriority= 8,
        mdate= new Date('2017-02-20 12:41:34.903'),
    ];

allocations[5] =
    [
        qtA= 45,
        mdata=  '1234',
        mid =  '234234234',
        qtyToDoTemp= 11,
        mpriority= 0,
        mdate= new Date('2017-04-27 11:26:02.147'),
    ];

allocations = allocations.sort((a, b) => {
   if (a[4] === b[4]) {
        return a[5].getTime() - b[5].getTime();
   }
   
   return a[4] - b[4];
})

console.log(allocations)

【讨论】:

    【解决方案2】:

    好的,在这里我已经重写了你的代码,以便它执行我认为你希望它执行的操作:

    var allocations = []; 
    allocations.push({
      qtA: 15,
      mdata: '1234',
      mid: '234234234',
      qtyToDoTemp: 11,
      mpriority: 5,
      mdate: new Date('2017-04-27 11:26:02.147')
    });
    
    allocations.push({
      qtA: 13,
      mdata: '1234',
      mid: '234234234',
      qtyToDoTemp: 11,
      mpriority: 5,
      mdate: new Date('2016-10-07 00:00:00.000')
    });
    
    allocations.push({
      qtA: 16,
      mdata: '1234',
      mid: '234234234',
      qtyToDoTemp: 11,
      mpriority: 4,
      mdate: new Date('2017-04-27 11:26:02.147')
    });
    
    allocations.push({
      qtA: 95,
      mdata: '1234',
      mid: '234234234',
      qtyToDoTemp: 11,
      mpriority: 1,
      mdate: new Date('2016-10-06 00:00:00.000')
    });
    
    allocations.push({
      qtA: 75,
      mdata: '1234',
      mid: '234234234',
      qtyToDoTemp: 11,
      mpriority: 8,
      mdate: new Date('2017-02-20 12:41:34.903')
    });
    
    allocations.push({
      qtA: 45,
      mdata: '1234',
      mid: '234234234',
      qtyToDoTemp: 11,
      mpriority: 0,
      mdate: new Date('2017-04-27 11:26:02.147')
    });
    

    如果您不熟悉 Javascript 并且来自不同的语言,请了解这一点:JS 中的数组与其他语言中的数组不同,它们是具有特殊语法的对象,并且尽力表现得像数组。

    【讨论】:

      【解决方案3】:

      您初始化数组的方式是错误的。尽管它运行时不会出错,但它的作用与您的预期不同。

      这个:

      allocations[0] =
      [   qtA =  15,
          mdata=  '1234',
          mid =  '234234234',
          qtyToDoTemp=  11,
          mpriority=  5,
          mdate=  new Date('2017-04-27 11:26:02.147'),
      ];
      

      ...实际上会将值分配给全局变量,如下所示:

      qtA =  15,
      mdata=  '1234',
      mid =  '234234234',
      qtyToDoTemp=  11,
      mpriority=  5,
      mdate=  new Date('2017-04-27 11:26:02.147')
      

      然后数组将在索引 0 处获得一个嵌套数组,其中包含以下值:

      allocations[0] = [
          15,
          '1234',
          '234234234',
          11,
          5,
          new Date('2017-04-27 11:26:02.147'),
      ];
      

      因此,您的代码的结果是嵌套数组的数组,而不是对象的数组。

      要创建对象数组,请使用以下语法:

      var allocations = [{
          qtA: 15,
          mdata:  '1234',
          mid:  '234234234',
          qtyToDoTemp:  11,
          mpriority:  5,
          mdate:  new Date('2017-04-27 11:26:02.147'),
      }, {
          qtA: 13,
          mdata:  '1234',
          mid :  '234234234',
          qtyToDoTemp: 11,
          mpriority: 5,
          mdate: new Date('2016-10-07 00:00:00.000'),
      }, {
          // ...etc, etc
      }];
      

      现在你的函数可以工作了:

      var sortOptions = {
          byPriorityAndDate: function (a, b) {
              return (b.mpriority - a.mpriority) || (a.mdate - b.mdate);
          },
      }
      
      var allocations = [{
          qtA: 15,
          mdata:  '1234',
          mid:  '234234234',
          qtyToDoTemp:  11,
          mpriority:  5,
          mdate:  new Date('2017-04-27 11:26:02.147'),
      }, {
          qtA: 13,
          mdata:  '1234',
          mid :  '234234234',
          qtyToDoTemp: 11,
          mpriority: 5,
          mdate: new Date('2016-10-07 00:00:00.000'),
      }, {
          qtA: 16,
          mdata:  '1234',
          mid :  '234234234',
          qtyToDoTemp: 11,
          mpriority: 4,
          mdate: new Date('2017-04-27 11:26:02.147'),
      }, {
          qtA: 95,
          mdata:  '1234',
          mid :  '234234234',
          qtyToDoTemp: 11,
          mpriority: 1,
          mdate: new Date('2016-10-06 00:00:00.000'),
      }, {
          qtA: 75,
          mdata:  '1234',
          mid :  '234234234',
          qtyToDoTemp: 11,
          mpriority: 8,
          mdate: new Date('2017-02-20 12:41:34.903'),
      }, {
          qtA: 45,
          mdata:  '1234',
          mid:  '234234234',
          qtyToDoTemp: 11,
          mpriority: 0,
          mdate: new Date('2017-04-27 11:26:02.147'),
      }];
      
      allocations.sort(sortOptions.byPriorityAndDate);
      
      console.log(allocations);
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

        猜你喜欢
        • 2013-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-23
        • 1970-01-01
        • 1970-01-01
        • 2012-11-27
        相关资源
        最近更新 更多