jquery .each - 奇怪的计算

时间:2016-05-18 20:46:00

标签: jquery each

我正在使用.each遍历页面上的元素并查看最大底部值。脚本似乎没问题,只是两个值之间的简单检查会返回一些奇怪的东西,我无法直接弄清楚我做错了什么。

这是我的div设置:

<div id="zone1" data-top="38" data-bottom="1648" data-left="131" data-width="467" data-group="0">...</div>
<div id="zone2" data-top="38" data-bottom="957" data-left="597" data-width="467" data-group="0">...</div>
<div id="zone3" data-top="38" data-bottom="4508" data-left="1064" data-width="467" data-group="0">...</div>

现在脚本:

maxb = 0;
console.log('init max '+maxb);
$('[data-group=0]').each(function()
    {
        tempb = $(this).attr('data-bottom');
        console.log(tempb+' '+maxb);
        if (tempb>maxb)     
            {
                maxb = tempb;
            }
        console.log(tempb+' '+maxb);    
    }); 

此脚本的目标是存储数据组0的最大数据底值。

如果我现在查看我的控制台输出:

init max 0
1648 0
1648 1648
957 1648
957 957
4508 957
4508 957

因此maxb被正确初始化。第一个数据底部大于0,因此maxb取这个值,但第二次迭代很奇怪,因为957低于1648,maxb应该仍然是1648但是它需要957作为最大值并保持到最后。这就像IF条件不能正常工作但我可能需要一些睡眠,我不知道问题出在哪里。

由于 劳伦

3 个答案:

答案 0 :(得分:3)

这是因为您在这里比较字符串值 - 这意味着&#34;排序&#34; RESP。比较是按字符逐个发生的。

根据该指标,当然957大于1648 - 因为它以字符9开头,并且大于1。因此,比较在此结束,并得出结论957大于1648。

首先使用parseInt

将值转换为实数
tempb = parseInt($(this).attr('data-bottom'), 10);

答案 1 :(得分:1)

你确定这些数字被视为整数吗?我知道你可以使用parseInt()来获取javascript来强制将字符串视为一个数字,但我懒惰所以我总是乘以1,这基本上是相同的。

基本上,您只需将代码更改为:

tempb = $(this).attr('data-bottom')*1;

答案 2 :(得分:1)

请参阅我的working example了解构建值数组的方法,然后从中获取最大值。

来源:jquery .each - strange calculation

<强>文档

Array prototype

.each()

.push()

遍历对象值并将.push()迭代到数组中。

var botArray = [];

$('[data-group=0]').each(function() {
  var item = parseInt($(this).attr('data-bottom'), 10);
  botArray.push(item);
});

var max = Array.prototype.max = function() {
  return Math.max.apply(null, botArray);
};

&#13;
&#13;
//https://stackoverflow.com/a/1669222/5076162

var botArray = [];

$('[data-group=0]').each(function() {
  var item = parseInt($(this).attr('data-bottom'), 10);
  botArray.push(item);
});

var max = Array.prototype.max = function() {
  return Math.max.apply(null, botArray);
};

$('.maxItem').text(max);
&#13;
.maxItem {
  color: orange;
}
p {
  font-family: arial;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<div id="zone1" data-top="38" data-bottom="1648" data-left="131" data-width="467" data-group="0">...</div>
<div id="zone2" data-top="38" data-bottom="957" data-left="597" data-width="467" data-group="0">...</div>
<div id="zone3" data-top="38" data-bottom="4508" data-left="1064" data-width="467" data-group="0">...</div>
<p>
  data-bottom max value is: <span class='maxItem'></span>
</p>
&#13;
&#13;
&#13;