Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:排序以零结尾的数字不起作用(4.0 5.0等)_Javascript_Jquery_Sorting - Fatal编程技术网

Javascript:排序以零结尾的数字不起作用(4.0 5.0等)

Javascript:排序以零结尾的数字不起作用(4.0 5.0等),javascript,jquery,sorting,Javascript,Jquery,Sorting,我使用下面的javascript根据当前div的数据属性数据评级从当前div的列表中获取排名,当当前数字为3.0、4.0或5.0(以零结尾)时,它将不起作用,并给出0而不是实际排名,我在这里做错了什么 var count = $.inArray($("[data-rating]").filter(".current").data("rating"), $.map($("[data-rating]"), function(el, i) { return Number(el.att

我使用下面的javascript根据当前div的数据属性数据评级从当前div的列表中获取排名,当当前数字为3.0、4.0或5.0(以零结尾)时,它将不起作用,并给出0而不是实际排名,我在这里做错了什么

var count = $.inArray($("[data-rating]").filter(".current").data("rating"), $.map($("[data-rating]"), function(el, i) {
         return Number(el.attributes["data-rating"].value)
        }).sort(function(b, a) {
         return a - b
        }));

$(".rating").html(count + 1);
HTML示例:

<div class="foo" data-rating="5.0"></div>
<div class="foo" data-rating="4.8"></div>
<div class="foo current" data-rating="4.0"></div>
<div class="foo" data-rating="4.3"></div>
<div class="foo" data-rating="3.7"></div>
<div class="foo" data-rating="4.3"></div>

<div class="rating"></div>

将第一个参数更改为
$.inArray()
为:

Number($("[data-rating]").filter(".current").attr("data-rating"))

问题源于使用
.data()
方法。您依靠该方法将
数据评级
属性值转换为
数字
,但它不会对
“4.0”
等值执行转换。相反,
.data()
为这些值返回一个
字符串。这意味着在这些情况下,您要将
字符串作为第一个参数传递给
$.inArray()
方法,这将导致它无法在数组中找到值

如果你看,它说:

仅当值转换为数字时,如果这样做不会更改 值的表示

因此,
.data()
不会将
“4.0”
转换为
数字,因为它只会转换为
4


由于这些问题,有一次我被建议使用
.data(key)
仅当值是用
.data(key,value)
设置时才获取值,如果值是使用HTML5
data-*
属性设置的(并执行显式类型转换),则使用
.attr(name)
。我认为这是一个很好的建议。

< P>所以我已经解开了你的代码,让它更容易通过。分拣工作正常:

var sorted = $.map($("[data-rating]"), function(el, i) {
     return Number(el.attributes["data-rating"].value)
    }).sort(function(b, a) {
     return a - b
    });
// [5, 4.8, 4.3, 4.3, 4, 3.7]
然后对
.current
元素进行评级,该元素返回
“4.0”

并将其传递给
$.inArray()

由于在数字数组中找不到字符串“4.0”,因此,
inaray
返回
-1
。由于某种原因,
$。inArray(当前,编号(排序))
也不起作用

如果在
.map
.inArray
中都使用
parseFloat
而不是
Number
,则它可以工作:

顺便问一下,排序的原因是什么?如果要使用class
.current
打印元素的评级,可以使用

$(".rating").html( $('[data-rating].current').data('rating') );

为什么你在JS中的一个地方使用
数据评论
,而你的HTML使用
数据评级
?建议不要尝试将这么多部分拼凑成一个,创建变量使逻辑更易于阅读我使用排序,因为我试图获得相对于其他值的排名,而不是评级本身。@coder哦,好的。然后,您可能需要注意重复评分,即如果四个项目的评分为5,而一个项目的评分为4,则根据您的期望结果,可能会说它在排名中排名第五或第二。谢谢,我知道,目前它运行良好,并说在这种情况下是第五名,这似乎是正确的。
 var count = $.inArray( current, sorted);
$(".rating").html( $('[data-rating].current').data('rating') );