2016-11-04 50 views
2

我想排序包含空字符串,数字,“无限”,“-infinity”和“NaN”的数组。我以字符串的形式接收所有值,因此在空字符串,inf和nan时排序不能按预期工作。有没有一种方法来按升序和降序来自定义我的排序函数?你如何排序与空字符串,NaN,数字和无穷大的数组

+1

什么是预期的结果?匿名函数没有'.name';函数如何被调用?为什么'String''“inf”'被认为是'Infinity'或'String''' Nan'''NaN'? – guest271314

+0

为什么不扩展你当前的逻辑并根据字符串的值为'result'赋值? – 2016-11-04 18:39:23

+0

为什么不使用像[Infinity]这样的真实全局变量(https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Infinity),[NaN](https://developer.mozilla.org/) fr/docs/Web/JavaScript/Reference/Objets_globaux/NaN)而不是使用字符串? – soywod

回答

0

编辑:根据您的评论,"" < "-inf" < "Nan" < "inf" < ... < -1 < 0 < 1 < ...。您可以通过修改order阵列来更改此设置。

注意如果数组包含order阵列中不存在的元素,则此代码将无法正常工作。您可以为此设置警戒,或将其他特殊元素(如0)添加到order阵列。

另请注意NaNInfinity(不是字符串文字)也是javascript中的一个数字。使用此代码,它们将在数字旁边订购。

var basicCompare = function (a, b) { 
    if (a > b) return 1; 
    if (a < b) return -1; 
    return 0; 
} 

var compare = function (a, b) { 
    // 0 represents numbers. 
    var order = ["", "-inf", "Nan", "inf", 0], 
     orderOfNumber = order.indexOf(0), 
     orderOfA = typeof(a) === "number" ? orderOfNumber : order.indexOf(a), 
     orderOfB = typeof(b) === "number" ? orderOfNumber : order.indexOf(b); 

    if (orderOfA === orderOfNumber & orderOfB === orderOfNumber) { 
     // They are both numbers, use regular comparison. 
     return basicCompare(a, b); 
    } 

    // They are not both numbers, so use the axiomatic order. 
    return basicCompare(orderOfA, orderOfB) 
} 

array.sort(compare); 
+0

想按字符串比较进行排序。我不想解析这个值。所以我的数组包含字符串和有效数字。我试图达到的顺序是arr = [“”,“-inf”,“Nan”,“inf”,-2,0,2,3]。 – nikitha

+0

我引用了这个公理来使用这个顺序。请阅读代码并随时向我提问。我认为这是你的意思。 – GMunguia

+0

这是否总是将“”,inf,nan作为字符串进行排序,然后按照相应的顺序对它们进行分组? – nikitha

1

您可以使用对象作为排序顺序并将给定的项目移动到想要的位置。

var array = ["", 2, 3, 0, "inf", "-inf", "Nan", -1, -100000]; 
 

 
array.sort(function (a, b) { 
 
    var order = { "": -4, "-inf": -3, "Nan": -2, "inf": -1 }; 
 
    return (order[a] || 0) - (order[b] || 0) || a - b; 
 
}); 
 

 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

你喜欢我的版本?感谢您的CSS :)? –

+0

不,数字按0分组,然后按实际增量分组,请参阅编辑'-100000'。 –

+0

@NinaScholz啊,我明白了。你知道是否有时候从比较函数返回'NaN'而不是'0',就像你的'a'和'b'都是'inf'一样? – Paulpro