使用jQuery求和值
我有几个动态生成的div行,其中包含div。每个div在自定义容器中都包含一个值。结构看起来像这样:使用jQuery求和值,jquery,Jquery,我有几个动态生成的div行,其中包含div。每个div在自定义容器中都包含一个值。结构看起来像这样: <div class="mainDiv"> <div class="block"> <div data-a="2"></div> <div data-b="3"></div> </div> <div class="block">
<div class="mainDiv">
<div class="block">
<div data-a="2"></div>
<div data-b="3"></div>
</div>
<div class="block">
<div data-a="1"></div>
<div data-b="3"></div>
</div>
<div class="block">
<div data-a="5"></div>
<div data-b="2"></div>
</div>
</div>
<div class="mainDiv">
<div class="block">
<div data-a="2"></div>
<div data-b="3"></div>
</div>
<div class="block">
<div data-a="1"></div>
<div data-b="3"></div>
</div>
<div class="block">
<div data-a="5"></div>
<div data-b="2"></div>
</div>
</div>
我想我已经接近了…无论传递到该函数中的是什么,都必须是一个项目数组(或一个生成项目数组的选择器)
.attr
不返回数组,它返回集合中第一个元素的属性值,因此这就是传入的全部内容:单个值
但是,这一项仍然不正确,因为这是.mainDiv
,而不是具有data-a
属性的子元素,而是.mainDiv
。在每个.mainDiv
中,您需要找到具有您要查找的属性的所有元素,然后将它们映射到该属性的值,并对结果值集求和:
$(".mainDiv").each(function(){
var views = sumTotals($(this).find('div[data-a]').map(function () {
return $(this).data('a');
});
var ptcps = sumTotals($(this).find('div[data-b]').map(function () {
return $(this).data('b');
});
});
。。。或者只是将数组相加,这可能更简单。确实很接近,但下面看一下代码:
sumTotals = function(context, selector) {
var sum = 0;
$('[data-'+selector+']', context).each(function() {
sum += 1*($(this).data(selector));
});
return sum;
}
$(".mainDiv").each(function(){
var views = sumTotals(this, "a");
var ptcps = sumTotals(this, "b");
console.log(views, ptcps)
});
您可以看到,在这段代码中,您传递了上下文和想要获取的数据-*
类似的方法也能奏效——尽管无可否认,我没有把a | b分开。我想你想要的是一个综合的总数。其他人有很好的分离解决方案:PTCP和视图
var ttlNum = 0;
var totals = jQuery('.mainDiv').find('div').map(function(){
return jQuery(this).data('a') || jQuery(this).data('b');
}).each(function(i,v){
ttlNum += v;
})
示例数据中只有一个元素具有class=“mainDiv”
。。。可能需要循环执行class=“block”
instead@poncha不,请再读一遍,这里有几个.mainDiv
,问题清楚地表明“我需要计算每个.mainDiv中data-a和data-b的总数”。
var ttlNum = 0;
var totals = jQuery('.mainDiv').find('div').map(function(){
return jQuery(this).data('a') || jQuery(this).data('b');
}).each(function(i,v){
ttlNum += v;
})