【问题标题】:sorting array by predefined number按预定义数字排序数组
【发布时间】:2016-01-06 16:56:58
【问题描述】:

假设我有多维数组

var arr = [{
    "id": "1",
    "firstname": "SUSAN",
    "dezibel": "91"
}, {
    "id": "2",
    "firstname": "JOHNNY",
    "dezibel": "74"
}, {
    "id": "3",
    "firstname": "ANDREA",
    "dezibel": "67"
}];

如何按“dezibel”而不是升序或降序对其进行排序,但最接近给定的数字?例如,

var num = 78;

所以目标值是 78。最终排序必须是:74、67、91。

【问题讨论】:

  • 但 dezibel 是对数值,也许排序应该尊重这一点?

标签: javascript jquery arrays sorting


【解决方案1】:

您需要使用自定义排序函数来比较每个对象的 dezibel 属性与 78 的绝对差异。

var arr = [{
    "id": "1",
    "firstname": "SUSAN",
    "dezibel": "91"
}, {
    "id": "2",
    "firstname": "JOHNNY",
    "dezibel": "74"
}, {
    "id": "3",
    "firstname": "ANDREA",
    "dezibel": "67"
}];

num = 78;

arr.sort(
  function(first,second){
    var a = Math.abs(num - (+first.dezibel));
    var b = Math.abs(num - (+second.dezibel));
    return a - b;
  });

alert(JSON.stringify(arr));

【讨论】:

    【解决方案2】:

    编写一个排序函数来计算到你的数字的距离:

    arr.sort(function(a, b){
        return Math.abs(num-a) - Math.abs(num-b);
    });
    

    使用它对数组中的dezibel 属性进行排序。它将计算每个人与num 之间的距离。然后它将选择两个距离中较小的一个,并继续以这种方式对整个数组进行排序。

    【讨论】:

    • 这将需要访问数组中对象的属性,而不仅仅是数组元素。
    • 我只是展示了排序功能,我将编辑我的文本以使其更清晰。谢谢!
    【解决方案3】:

    按绝对差值排序。

    var arr = [{ "id": "1", "firstname": "SUSAN", "dezibel": "91" }, { "id": "2", "firstname": "JOHNNY", "dezibel": "74" }, { "id": "3", "firstname": "ANDREA", "dezibel": "67" }],
        num = 78;
    
    arr.sort(function (a, b) {
        return Math.abs(a.dezibel - num) - Math.abs(b.dezibel - num);
    });
    document.write('<pre>' + JSON.stringify(arr, 0, 4) + '</pre>');

    【讨论】:

      【解决方案4】:

      .sort 可选地接受一个函数。该函数一次取 2 个值,并比较它们:

      • 如果第一个值的排序高于第二个值,则函数应返回一个正数。
      • 如果第一个值的排序低于第二个,则函数应返回负数。
      • 如果值相等,函数应该返回0

      所以,如果你想按dezibel 升序排序,你可以这样做

      arr.sort(function(a,b){
          return a.dezibel- b.dezibel;
      });
      

      但是,您想按dezibel 与某个数字的距离进行排序。要找出78dezibel 值的差值大小,请取差值的绝对值:

      Math.abs(78 - a.dezibel)
      

      现在,如果我们想根据每个对象的该值进行排序,我们可以对 Math.abs 调用 ab 进行区别:

      arr.sort(function(a,b){
          return Math.abs(78 - a.dezibel) - Math.abs(78 - b.dezibel);
      });
      

      【讨论】:

      • 谢谢大家的帮助。我会接受这个作为答案,因为这是最详细的回复。
      【解决方案5】:

      您可以为此使用数组排序功能:

      arr.sort(function(a, b) {
         return num - 1 * a.dezibel + num - 1 * b.dezibel
      })
      

      【讨论】:

        【解决方案6】:

        我只是添加一个距离然后对其进行排序...

        num=78
        for e in arr
            e.dist=Math.abs(e.dezibel - num)
        arr.sort (l,r) =>
            if l.dist > r.dist then 1 else -1
        

        删除后的dist

        但是放在一行也可以

            arr.sort (l,r) =>
                if Math.abs(l.dezibel - num) > Math.abs(r.dezibel - num) then 1 else -1
        

        【讨论】:

          猜你喜欢
          • 2016-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多