【问题标题】:How to sort a part of an array with javascript?如何使用javascript对数组的一部分进行排序?
【发布时间】:2016-03-29 20:09:02
【问题描述】:

我有一个包含许多对象的数组。我正在尝试按升序对数组的前半部分进行排序。数组的后半部分也以升序排列。下面的代码是一个数组示例和我的方法。我在想有没有更聪明的方法来锐化代码并获得相同的结果?任何人都可以帮忙吗?提前致谢!

var data = [
    {id:1, x: 33},
    {id:2, x: 22},
    {id:3, x: 11},
    {id:4, x: 3},  
    {id:5, x: 2},
    {id:6, x: 1}  
];
var data1 = [];
for(var i=0; i<3; i++){
  data1.push(data[i]);
}
data1.sort (function(a,b) { return a.x - b.x; });

var data2 = [];
for(var i=3; i<6; i++){
  data2.push(data[i]);
}
data2.sort (function(a,b) { return a.x - b.x; });

data = data1.concat(data2);
console.log(data);

【问题讨论】:

  • 您能告诉我们您想如何订购吗?按 id 还是 x?
  • 仅供参考,您可以通过摆脱 for 循环来缩短它,而是这样做:var data1 = data.splice(data.length/2); var data2 = data

标签: javascript arrays


【解决方案1】:

使用拼接会收紧:

var data = [
    {id:1, x: 33},
    {id:2, x: 22},
    {id:3, x: 11},
    {id:4, x: 3},  
    {id:5, x: 2},
    {id:6, x: 1}  
];

// splice out and sort the first half of data
var data1 = data.splice(0,data.length / 2);
data1.sort (function(a,b) { return a.x - b.x; });

// sort the second half
data.sort (function(a,b) { return a.x - b.x; });

data = data1.concat(data);
console.log(data);

【讨论】:

  • 为什么data.splice(1,data.length / 2) 应该在这种情况下工作? console.log(data) 给出x 属性的以下顺序:3, 11, 22, 1, 2, 33
  • @nnnnnn 是的,应该。修复。
【解决方案2】:
/**
 * This method allows you to split array in two peaces
 * @param Array array - the array which you want to split
 * @returns array
 */
function sort2Array(array) {
    var results = [],
        length = Math.ceil(array.length / 2),
        iterations = array.length / length;
    for (var i = 0; i < iterations; i++) {
        var peace = array.slice(i * length, (i + 1) * length);
        results.push(peace.sort(function(a, b) { return a.x - b.x; }));
    }

    return results[0].concat(results[1]);
}

var data = [
    { id: 1, x: 33 },
    { id: 2, x: 22 },
    { id: 3, x: 11 },
    { id: 4, x: 3 },
    { id: 5, x: 2 },
    { id: 6, x: 1 }
]

sort2Array(data);

【讨论】:

    【解决方案3】:

    您可以使用Array#slice() 对数组进行切片,并使用Array#concat() 进行连接。

    function sortX(a, b) {
        return a.x - b.x;
    }
    
    var data = [{ id: 1, x: 33 }, { id: 2, x: 22 }, { id: 3, x: 11 }, { id: 4, x: 3 }, { id: 5, x: 2 }, { id: 6, x: 1 }],
        first = data.slice(0, data.length / 2 | 0).sort(sortX),
        second = data.slice(data.length / 2 | 0, data.length).sort(sortX);
    
    data = first.concat(second);
    document.write('<pre>' + JSON.stringify(data, 0, 4) + '</pre>');

    【讨论】:

      【解决方案4】:
      var data = [
          {id:1, x: 33},
          {id:2, x: 22},
          {id:3, x: 11},
          {id:4, x: 3},  
          {id:5, x: 2},
          {id:6, x: 1}  
      ];
      var sort_fn = function(a,b) { return a.x - b.x; };
      function half_sort(p) {
          var m = p.length/2;
          return Array.prototype.concat(
            p.slice(0, m).sort(sort_fn),
            p.slice(m).sort(sort_fn) )
      }
      var result = half_sort(data)
      

      【讨论】:

        【解决方案5】:

        使用 ES6

        let data = [
            {id:1, x: 33},
            {id:2, x: 22},
            {id:3, x: 11},
            {id:4, x: 3},  
            {id:5, x: 2},
            {id:6, x: 1}  
        ];
        const up = data.slice(0,data.length/2).sort((prev,next) => prev.x - next.x);
        const low = data.slice(data.length/2,data.length).sort((prev,next) =>  next.x - prev.x);
        data = up.concat(low)
        

        【讨论】:

          猜你喜欢
          • 2017-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-28
          • 1970-01-01
          • 2012-07-04
          • 2020-04-08
          • 1970-01-01
          相关资源
          最近更新 更多