按预定义的数字排序数组

时间:2016-01-06 16:56:59

标签: javascript jquery arrays sorting

我们说我有多维数组

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。

6 个答案:

答案 0 :(得分:2)

编写一个排序函数,用于计算与您的数字的距离:

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

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

答案 1 :(得分:2)

您需要使用自定义排序功能,将每个对象的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 :(得分:1)

按绝对差异排序。



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>');
&#13;
&#13;
&#13;

答案 3 :(得分:0)

.sort可选择执行一项功能。该函数一次取2个值,并对它们进行比较:

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

因此,如果您想按升序排序dezibel,则可以执行

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

但是,您希望按dezibel与某个号码的距离排序。要查找与78dezibel值之差的大小,请取差值的绝对值:

Math.abs(78 - a.dezibel)

现在,如果我们想根据每个对象的值进行排序,我们可以对Math.absa的{​​{1}}调用区分:

b

答案 4 :(得分:0)

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

filter

答案 5 :(得分:0)

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

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