Javascript jQuery push()进入数组的奇怪行为
我想把一些元素放到二维数组中 我使用的代码是:Javascript jQuery push()进入数组的奇怪行为,javascript,jquery,arrays,Javascript,Jquery,Arrays,我想把一些元素放到二维数组中 我使用的代码是: samount.push ({ "value": val, "currency": currency }); 我正在尝试将阵列推入samount,如下所示: samount.push ({ "value": val, "currency": currency }); groupedArray = [{value: 100, currency: 'EU
samount.push ({
"value": val,
"currency": currency
});
我正在尝试将阵列推入samount,如下所示:
samount.push ({
"value": val,
"currency": currency
});
groupedArray =
[{value: 100, currency: 'EUR'},
{value: 100, currency: 'EUR'},
{value: 100, currencu: 'EUR'}]
事实上,上面的数组表示一个表的行,在每次单击行时,push()函数都会向do samount数组添加一个新元素
samount.push ({
"value": val,
"currency": currency
});
单击两行后,samount数组如下所示:
samount.push ({
"value": val,
"currency": currency
});
samount =
[{value: 100, currency: 'EUR'},
{value: 100, currency: 'EUR'}]
在第三行单击时,阵列变为:
samount.push ({
"value": val,
"currency": currency
});
samount =
[{value: 200, currency: 'EUR'},
{value: 100, currency: 'EUR'},
{value: 100, currencu: 'EUR'}]
我必须提到,我的代码里面没有求和,所以push()函数对第一个元素的值求和,并且仍然将它们添加到数组中,这是非常奇怪的
samount.push ({
"value": val,
"currency": currency
});
您知道push()函数是否可以将元素添加到这种类型的数组中吗
samount.push ({
"value": val,
"currency": currency
});
完整的代码是:
samount.push ({
"value": val,
"currency": currency
});
"fnDrawCallback": function (oSettings) {
var $dt = $('#dt_debts').footable({
breakpoints: { // The different screen resolution breakpoints
phone: 320,
tablet: 768
}
});
$dt.trigger('footable_resize');
var amount = new Array();
var samount = new Array();
$('#dt_debts tbody tr ').each( function () {
var iPos = oTable.fnGetPosition( this );
if (iPos!=null) {
var aData = oTable.fnGetData( iPos );
if (jQuery.inArray(aData[0], selected)!=-1) {
$(this).addClass('row_selected');
$(this).find( 'td input:checkbox' ).attr('checked', 'checked');
}
}
$(this).click( function (e) {
e.preventDefault();
var iPos = oTable.fnGetPosition( this );
var aData = oTable.fnGetData( iPos );
var iId = aData[0];
is_in_array = jQuery.inArray(iId, selected);
if (is_in_array==-1) {
selected[selected.length]=iId;
}
else {
selected = jQuery.grep(selected, function(value) {
return value != iId;
});
}
if ( $(this).hasClass('row_selected') ) {
console.info('>>> Operatie de eliminare');
$(this).removeClass('row_selected');
$(this).find( 'td input:checkbox' ).prop('checked', false);
if ($(aData[0]).data('typo') == "t-0") {
val = parseFloat(aData[9].split(" ")[0]);
currency = aData[9].split(" ")[1];
if (currency != '') {
$.each(amount, function(idx, item) {
if (item.currency == currency && item.value == val) {
amount.splice(idx, 1); // Remove current item
return false; // End the loop
}
});
}
} else if ($(aData[0]).data('typo') == "t-1") {
val = parseFloat(aData[10].split(" ")[0]);
currency = aData[10].split(" ")[1];
if (currency != '') {
$.each(samount, function(idx, item) {
if (item.currency == currency && item.value == val) {
samount.splice(idx, 1); // Remove current item
return false; // End the loop
}
});
}
}
console.info(amount);
console.info(samount);
} else {
console.info('>>> Operatie de adaugare');
$(this).addClass('row_selected');
$(this).find( 'td input:checkbox' ).attr('checked', 'checked');
if ($(aData[0]).data('typo') == "t-0") {
val = parseFloat(aData[9].split(" ")[0]);
currency = aData[9].split(" ")[1];
if (currency != '') {
amount.push ({
"value": val,
"currency": currency
});
}
} else if ($(aData[0]).data('typo') == "t-1") {
val = parseFloat(aData[10].split(" ")[0]);
currency = aData[10].split(" ")[1];
if (currency != '') {
samount.push ({
"value": val,
"currency": currency
});
}
}
console.info(amount);
console.info(samount);
}
}
在花了数小时搜索错误后,我发现错误在代码的这一部分:
samount.push ({
"value": val,
"currency": currency
});
var objects1 = new Array();
objects1 = samount;
var categories1 = new Array();
var groupedObjects1 = [];
var i = 0;
_.each(objects1,function(obj){
var existingObj;
if($.inArray(obj.currency,categories1) >= 0) {
existingObj = _.find(objects1,function(o){return o.currency === obj.currency;});
existingObj.value += obj.value;
} else {
groupedObjects1[i] = obj;
categories1[i] = obj.currency;
i++;
}
});// JavaScript Document
实际上,samount数组似乎正在被修改,即使我已经声明了一个新数组用于into循环。我不明白为什么循环会修改初始数组,即使我没有使用它是的,推送也可以。事实上,我对它进行了测试,它按照预期工作。我假设正在发生的是在其他地方修改的值-因为您正在使用值
val
将一个对象推入数组中,数组将只包含对整个对象的引用而不是它所表示的值
samount.push ({
"value": val,
"currency": currency
});
只是为了说明这一点
samount.push ({
"value": val,
"currency": currency
});
var val = { "value" : 100 };
var storage = [ ];
storage.push(val);
console.log("value : " + val.value);
console.log("value in storage : " + storage[0]["value"]);
val.value = 200;
console.log("value : " + val.value);
console.log("value in storage : " + storage[0]["value"])
屈服
samount.push ({
"value": val,
"currency": currency
});
value : 100
value in storage : 100
value : 200
value in storage : 200
JavaScript中的变量对于原语(例如整数)是按值传递的,但对于对象是按引用传递的。您可以使用.join()
而不是.push()
samount.push ({
"value": val,
"currency": currency
});
请显示更多获取
值的周围代码
。另外,你到底需要什么帮助还不清楚。你看到了什么结果?那么,你期望它是什么呢?你是说推就是推的值的总和?你有没有可能在小提琴上重新创建它。我想在小提琴上重新创建它很可能是不可能的,因为它的代码结构很大。。你说的对,在推送数组时,值是在第二行单击后求和的。我使用带有fnDrawCallback的jQuery Datatables,在每行单击时,我将值从表推送到arrayWell,push()不会对对象内的值求和,所以我认为不可能重新创建,这就是我问的原因。还有一些事情正在发生,只是推与此无关。我想你是想说“通过引用传递”,但那是不正确的。JS总是“按值传递”。“通过引用传递”是另一回事:。感谢您的回答,但是在代码中搜索了几个小时的错误后,我发现eror位于一个循环中。我将编辑我的帖子,以说明错误在哪里,但我仍然不知道如何解决它。我想这里有一个名为\u
(下划线)的数组。看那个