【问题标题】:Sorting value data arrays in JavaScript在 JavaScript 中对值数据数组进行排序
【发布时间】:2015-11-12 22:34:19
【问题描述】:

我有以下数组结构

[
    [ "April", "January", "March", "February" ]
    [ "10", "20", "5", "2" ]
]

月份不按顺序排列,数字代表每个月的数据。例如January 有20 项目,March 有5 项目等。

在 JavaScript/jQuery 中有没有一种方法可以保留结构但按如下所示对其进行排序?

[
    [ "January", "February", "March", "April" ]
    [ "20", "2", "5", "10" ]
]

【问题讨论】:

  • 是否可以将您的一个或多个数组更改为一个对象?考虑到您的要求,拥有键/值对似乎更有意义。
  • 你可以对月份数组进行排序,并将排序镜像到第二个数组

标签: javascript jquery arrays sorting


【解决方案1】:

使用下划线...

var d = [ 
 [ "April", "January", "March", "February" ],
 [ "10", "20", "5", "2" ]
];

var months = {January:1, February:2, March:3, April:4}

var d = _.unzip(_.sortBy(_.zip(d[0],d[1]), function(a) { return months[a[0]] }))

【讨论】:

  • 这听起来很甜蜜。感谢 Keith 的快速响应以及其他所有人。我真的很欣赏下面的cmets。把它变成一个对象听起来也是一个不错的建议。再次感谢大家。
【解决方案2】:

正如 Rory 所建议的,将数据放在一个对象中会更容易。

[
  {
    month: "January",
    items: 20
  }, { // next object }
]

不过,不管怎样,这个任务还是很容易解决的:

// first, define the correct order of months:
var sortedMonths = [ "January", "February", "March", "April" ]

// your unsorted months and items:
var months = [ "April", "January", "March", "February" ]
var items = [ "10", "20", "5", "2" ]
var sortedItems = []
sortedMonths.forEach(function(month) {
  // find index of the month in the unsorted array:
  var index = months.indexOf(month)
  // get item at the index and insert into sorted array:
  sortedItems.push(items[index])      
})

console.log(sortedItems) // ["20", "2", "5", "10"]

【讨论】:

    【解决方案3】:

    这是一种方法,将它们放入对象数组中,对该数组进行排序,然后重建原始结构:

    var data = [
        [ "April", "January", "March", "February" ],
        [ "10", "20", "5", "2" ]
    ];
    
    // key for sorting months
    var monthSortIndex = {January: 1, February:2, March:3, April:4, May:5, June:6, July:7, August:8, September:9, October:10, November:11, December: 12};
    
    function getMonthSort(m) {
        var val = monthSortIndex[m];
        return val ? val: 13;
    }
    
    function sortMonthData(data) {
        // first put data into one array of objects
        var months = data[0];
        var numbers = data[1];
        months.map(function(value, index, array) {
            return {month: value, data: numbers[index]};
        }).sort(function(a, b) {
            return getMonthSort(a.month) - getMonthSort(b.month);
        }).forEach(function(obj, index) {
            data[0][index] = obj.month;
            data[1][index] = obj.data;
        });
    }
    
    sortMonthData(data);
    
    // show result in snippet
    document.write(JSON.stringify(data));

    【讨论】:

      【解决方案4】:

      如果一定要有数组形式:

      [{January: 20}, {Feb:2}, {March:5}, {April, 10}];
      

      在我看来,它是价值对的关键。使用对象!

      【讨论】:

        【解决方案5】:

        或者用地图:

        var data = [
            [ "April", "January", "March", "February" ],
            [ "10", "20", "5", "2" ]
        ]
        
        var order = [ "January", "February", "March", "April" ]
        
        order.map(function(name){
          var index = data[0].indexOf(name);
          return  [data[0][index], data[1][index]]
        }).forEach(function(element, index){
          data[0][index] = element[0];
          data[1][index] = element[1];
        });
        

        【讨论】:

          【解决方案6】:

          此解决方案基于每个月的索引创建一个临时数组,因此它会自动排序。

          看起来像这样:

          [{"month":"January","value":"20"},
           {"month":"February","value":"2"},
           {"month":"March","value":"5"},
           {"month":"April","value":"10"}
          ]
          

          然后就是遍历数组的简单问题。

          片段:

          var arr = [
                ["April", "January", "March", "February"],
                ["10", "20", "5", "2"]
              ],
              months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
              tmp= [];
          
          arr[0].forEach(function(mo, i) {
            tmp[months.indexOf(mo)]= {
              month: mo,
              value: arr[1][i]
            }
          });
          
          tmp.forEach(function(key, i) {
            arr[0][i]= key.month;
            arr[1][i]= key.value;
          });
          
          document.querySelector('pre').textContent= JSON.stringify(arr);
          <pre></pre>

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-11-01
            • 2016-05-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-04-08
            相关资源
            最近更新 更多