【问题标题】:Sort array by custom variables按自定义变量排序数组
【发布时间】:2016-02-17 09:13:02
【问题描述】:
$("#show_times_available_" + pos).find("td span").parent().each(function(){ 
    array.push($(this).attr("id")); 
    array = array.sort();
});

我的数组获取所有元素并获取它们的 ID 并将其推送到一个数组中,因此我的数组最终将成为;

[ "mon_0600-0", "sun_0700-0", "thu_0600-0", "thu_0700-0", "tue_0300-0", "wed_0700-0" ];

每次将新元素推入数组时,我尝试将这些元素排序为(周一、周二、周三等)。这样我的数组最终会变成;

[ "mon_0600-0", "tue_0300-0", "wed_0700-0", "thu_0600-0", "thu_0700-0", "sun_0700-0" ];

使用基本的sort() 函数会按字母顺序排列,我知道sort() 函数可以接收另一个函数。我只是不确定如何在 vanilla javascript 或 jQuery 中进行设置。是否有 CASE THEN 或使用 when()then() 对这些进行排序的方法?我已经在 google 和 SO 周围搜索过,但什么都没有。

【问题讨论】:

    标签: javascript jquery arrays sorting


    【解决方案1】:

    如您所说,您需要将自定义函数传递给sort()。在这里,您需要将天与时间分开,然后返回日期部分和时间部分的比较(如果天数相同):

    var arr = ["mon_0600-0", "sun_0700-0", "thu_0600-0", "thu_0700-0", "tue_0300-0", "wed_0700-0"];
    
    // store the order of the days
    var days = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"];
    
    var arrSorted = arr.sort(function(a, b) {
      // a and b are two times to compare
    
      // split each into days and times, e.g ["mon", "0600-0"]
      var aSplit = a.split("_");
      var bSplit = b.split("_");
      
      // get the index of the days to compare
      var dayA = days.indexOf(aSplit[0]);
      var dayB = days.indexOf(bSplit[0]);
      
      // if days are the same, compare the times using normal String comparison
      // if days are different, return the comparison of their position in the array
      return dayA == dayB ?
      	aSplit[1].localeCompare(bSplit[1])
      	: dayA - dayB;
    });
    
    console.log(arrSorted);

    【讨论】:

      【解决方案2】:

      这里有一个自定义排序功能

      // your array
      array = [ "mon_0600-0", "sun_0700-0", "thu_0600-0", "thu_0700-0", "tue_0300-0", "wed_0700-0" ];
      
      // the order stored in an object
      daynames={
          mon:1,
          tue:2,
          wed:3,
          thu:4,
          fri:5,
          sat:6,
          sun:7
      }
      
      // the custom sort function which gets the value for the dayname-key and compares
      function SortByDayName(a, b){
      
        // get the value of dayname + the time 
        var aName = daynames[a.substr(0,3)] + a.substr(4,7);;
        var bName = daynames[b.substr(0,3)] + b.substr(4,7);; 
        return ((aName < bName) ? -1 : ((aName > bName) ? 1 : 0));
      }
      
      // apply sort
      array.sort(SortByDayName);
      
      // output:
      ["mon_0600-0", "tue_0300-0", "wed_0700-0", "thu_0600-0", "thu_0700-0", "sun_0700-0"]
      

      【讨论】:

      • 不处理时间,尝试切换"thu_0700-0""thu_0600-0"
      • 哦,我没有得到这个要求,这是一个简单的更新,现在可以使用
      • 现在 thu_0600 变为 4060 并且 thu_0700 变为 4070 所以比​​较将放置正确的顺序
      【解决方案3】:

      我建议你使用一个以排序方式包含天数的数组:

      var days = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"];
      

      然后您可以使用索引对数据进行排序:

      array = array.sort(function (x, y) {
          return days.indexOf(x.slice(0,3)) - days.indexOf(y.slice(0,3));
      });
      

      【讨论】:

      • 不处理时间,"thu_0700-0""thu_0600-0" 是错误的方式
      【解决方案4】:

      当您使用.sort 时,您可以指定一个进行比较的函数。

      你的函数必须接收两个参数,比如compare(a,b),如果a在前则返回小于零,如果两者必须占据相同位置则返回零,如果b必须在a之后则返回大于零.

      var array = ["X123", "X0072", "X04"];
      
      var compareFunction = function(a,b) {
        var _a = parseInt(a.substring(1));
        var _b = parseInt(b.substring(1));
        return _a-_b;
      }
      
      $('#original').text(JSON.stringify(array));
      
      array.sort();
      $('#sort').text(JSON.stringify(array));
      
      array.sort(compareFunction);
      $('#customSort').text(JSON.stringify(array));
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      
      <p>Original:</p>
      <pre id="original"></pre>
      
      <p>Sort:</p>
      <pre id="sort"></pre>
      
      <p>Custom sort:</p>
      <pre id="customSort"></pre>

      【讨论】:

        【解决方案5】:

        你可以使用这个函数来做到这一点

        var array = ["mon_0600-0", "sun_0700-0", "thu_0600-0", "thu_0700-0", "tue_0300-0", "wed_0700-0"],
          sort = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"];
        
        var sortondays = function() {
          var newArray = [];
          for (i = 0; i < sort.length; i++) {
            var t = sort[i];
            for (x = 0; x < array.length; x++) {
              if (array[x].startsWith(t)) {
                newArray.push(array[x])
              }
            }
          }
          return newArray;
        }
        console.log(sortondays());

        【讨论】:

          【解决方案6】:

          这个问题对于Sorting with map 来说是完美的,因为一天的拆分和查找只针对一个元素进行一次,而不是针对每个排序回调。

          // the array to be sorted
          var data = ["mon_0600-0", "sun_0700-0", "thu_0600-0", "thu_0700-0", "tue_0300-0", "wed_0700-0"];
          
          // temporary array holds objects with position and sort-value
          var mapped = data.map(function (el, i) {
              var value = el.split('_'), day;
              return {
                  index: i,
                  day: { mon: 1, tue: 2, wed: 3, thu: 4, fri: 5, sat: 6, sun: 7 }[value[0]] || 0,
                  hour: value[1]
              };
          })
          
          // sorting the mapped array containing the reduced values
          mapped.sort(function (a, b) {
              return a.day - b.day || a.hour.localeCompare(b.hour);
          });
          
          // container for the resulting order
          var result = mapped.map(function (el) {
              return data[el.index];
          });
          
          document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-05-26
            相关资源
            最近更新 更多