【问题标题】:Sorting array of arrays of weekdays (JavaScript)对工作日数组进行排序(JavaScript)
【发布时间】:2018-08-28 12:08:09
【问题描述】:

有下一个数组(例如):

[
 ['Tue', 'Fri'],
 ['Mon'],
 ['Mon', 'Thu', 'Sun'],
 ['Wed', 'Thu', 'Sun'],
 ['Tue', 'Wed']
]

我需要对其进行排序以获得下一个:

[
 ['Mon'],
 ['Mon', 'Thu', 'Sun'],
 ['Tue', 'Wed'],
 ['Tue', 'Fri'],
 ['Wed', 'Thu', 'Sun']
]

并不表示数组中的天数可以是多少-如果大于1,则其他应分别排序到其在周中的位置索引。

这样的排序功能如何实现?谢谢。

【问题讨论】:

  • 你卡在哪里了?我看到一个编程问题没有尝试解决它。 SO 不是为您工作的地方
  • 你能改变数据集的结构吗?您可以使用一些键值对来代替数组吗?这样,每一天都可以有一个与其在一周中的位置相对应的索引。
  • JavaScript 中数组的排序是通过Array.prototype.sort完成的
  • @FNTNBWIH 是的,我可以以任何方式更改数据集的结构,但我不知道哪个更好。实际上提供的结构已经改变 - 原来我只有几天的位掩码。
  • @vol7ron 我坚持实现排序功能,该功能将尊重我所描述的排序规则。我试图解决它给每一天的权重,但如果我们有Mon, SutTue, Wed,这将不起作用。假设每天都有它的权重等于它的指数。 Mon + Sut 给出 5,Tue + Wed 给出 3,意思是 Tue, Wed 应该在 Mon, Sut 之前,但这是错误的。

标签: javascript arrays sorting date days


【解决方案1】:

这不会考虑所有情况,但会执行以下操作:

  • 使用预先描述的排序对象
    • 使用排序列表可以更轻松地将星期日从第一个切换到最后一个(或使用其他一些自定义/加权排序)
    • 您不仅限于对象,还可以使用数组(检索索引)或日期(转换日期),但我认为对象或集合可能更有效
  • 在存在平局的情况下使用递归来评估下一个元素
    • 如果没有下一个元素,则顺序(_a_b)默认为 0,因为缺少元素具有更高的优先级
    • 您可以在此处签入以完全避免递归调用

let order = {
 'Mon':1,
 'Tue':2,
 'Wed':3,
 'Thu':4,
 'Fri':5,
 'Sat':6,
 'Sun':7
}

let arr = [
 ['Tue', 'Fri'],
 ['Mon'],
 ['Mon', 'Thu', 'Sun'],
 ['Wed', 'Thu', 'Sun'],
 ['Tue', 'Wed']
]


let sorted = arr.sort(sortElements)
console.log('sorted:',sorted)


function sortElements(a,b,ndx=0){
  let _a = order[ a[ndx] ] || 0
  let _b = order[ b[ndx] ] || 0
    
  if ( _a === _b && (a.length > ndx || b.length > ndx))
    return sortElements(a,b,ndx+1)
  else
    return _a - _b
}

【讨论】:

  • ` [ "Tue", "Fri" ], [ "Tue", "Wed" ],`他没有遵循他要求的例子
  • 没看到你改了答案,很抱歉
  • @vol7ron OP 在代码中有拼写错误。他修复了它,您的答案可以变得更简单。
  • 它没有解决数组中的嵌套天数,用于对外部数组进行排序。
  • @NinaScholz 你去 - 希望它很容易跟随 w/o cmets
【解决方案2】:

如果您可以重组数据,这可能会有所帮助。

 let days = [
  {day:'Mon',index:1},
  {day:'Sat',index:6},
  {day:'Sun',index:0},
  {day:'Wed',index:3},
  {day:'Tue',index:2},
  {day:'Thu',index:4},
  {day:'Fri',index:5},
];

days.sort((a,b) => {return a.index > b.index});

【讨论】:

    【解决方案3】:

    我写了一个函数 compareArray ,只是为了确定两个数组的顺序,比如 ['Tue', 'Wed'] 和 ['Tue', 'Fri']。然后在排序功能中使用它

    var arr = [
     ['Tue', 'Fri'],
     ['Mon'],
     ['Mon', 'Thu', 'Sun'],
     ['Wed', 'Thu', 'Sun'],
     ['Tue', 'Wed']
    ]
    
    var order = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    
    
    var compareArray = (arr1, arr2) => {
      for(var i=0;i<arr1.length;i++){
         if(!arr2[i]) {return 1}
        if(order.indexOf(arr1[i]) < order.indexOf(arr2[i])) {
           return -1;
       } else if(order.indexOf(arr1[i]) > order.indexOf(arr2[i])){ 
          return 1;
      }
     }
      return 0;
    }
    
    arr.sort((a,b) => compareArray(a,b))
    
    console.log(arr)

    【讨论】:

      【解决方案4】:

      您可以获取一个带有可排序项目的对象,这些项目可以堆叠成一个字符串。

      const
          days = { Mon: 'a', Tue: 'b', Wed: 'c', Thu: 'd', Fri: 'e', Sat: 'f', Sun: 'g' },
          getV = a => a.map(d => days[d]).join('');
      
      var array = [['Tue', 'Fri'], ['Mon'], ['Mon', 'Thu', 'Sun'], ['Wed', 'Thu', 'Sun'], ['Tue', 'Wed']];
      
      array.sort((a, b) => getV(a).localeCompare(getV(b)));
      
      console.log(array);
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

      • 我喜欢这种简洁
      【解决方案5】:

      如果你写了两个函数来将名称转换为值和将值转换为名称,那么它是单行的。

      function dayvalue (day)
      {
        switch (day) {
        case 'Mon': return 0;
        case 'Tue': return 1;
        case 'Wed': return 2;
        case 'Thu': return 3;
        case 'Fri': return 4;
        case 'Sat': return 5;
        case 'Sun': return 6;
        }
      }
      
      function dayname (value)
      {
        switch (value) {
        case 0: return 'Mon';
        case 1: return 'Tue';
        case 2: return 'Wed';
        case 3: return 'Thu';
        case 4: return 'Fri';
        case 5: return 'Sat';
        case 6: return 'Sun';
        }
      }
      
      var days = [
        ['Tue', 'Fri'],
        ['Mon'],
        ['Mon', 'Thu', 'Sun'],
        ['Wed', 'Thu', 'Sun'],
        ['Tue', 'Wed']
      ];
      
      console.log(days.map(names => names.map(dayvalue)).sort().map(values => values.map(dayname)));

      【讨论】:

        【解决方案6】:

        您可以通过将每个数组转换为字符串表示形式并使用String.prototype.localeCompare() 进行排序来实现:

        const input = [['Tue', 'Fri'],['Mon'],['Mon', 'Thu', 'Sun'],['Wed', 'Thu', 'Sun'],['Tue', 'Wed']];
        
        const days = {Mon:'a', Tue:'b', Wed:'c', Thu:'d', Fri:'e', Sat:'f', Sun:'g'};
        
        const sorted = input.sort((a,b) => {
            const [aLoc, bLoc] = [a,b].map(e => e.map(d => days[d]).join(''));
            return aLoc.localeCompare(bLoc);
        });
        
        console.log(sorted);

        【讨论】:

          猜你喜欢
          • 2021-08-13
          • 2014-03-10
          • 1970-01-01
          • 2019-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多