javascript推送()未按预期工作
在发送到ajax帖子之前,我想在数组中添加一些复选框信息,但当它循环通过复选框时,似乎会增加数组中的项目数,但会使数组中的每个条目都具有相同的内容。这是我的密码javascript推送()未按预期工作,javascript,jquery,Javascript,Jquery,在发送到ajax帖子之前,我想在数组中添加一些复选框信息,但当它循环通过复选框时,似乎会增加数组中的项目数,但会使数组中的每个条目都具有相同的内容。这是我的密码 var aData = []; var item = []; $(".providers_chk").each(function (index, element) { if ($(this).attr("checked")) { item[0] = element.value; item[1] =
var aData = [];
var item = [];
$(".providers_chk").each(function (index, element) {
if ($(this).attr("checked")) {
item[0] = element.value;
item[1] = element.name;
aData.push(item);
console.log(aData);
}
});
对于每个条目,数组看起来都像{“foo”,“bar”},而不是{“foo”,“bar”},{“foo1”,“bar1”},{“foo2”,“bar2}等。您正在更新并在回调函数中推送相同的数组引用。相反,在回调函数中使用局部变量,或者直接生成数组并推送到
aData
数组
尽管您可以在回调中使用this
引用元素,因此不需要使用回调参数
var aData = [];
$(".providers_chk").each(function () {
if (this.checked) { // check the checked property
aData.push([this.value, this.name]);
}
});
$('.providers_chk').change(函数(){
变量aData=[];
$(“.providers_chk”)。每个(函数(){
如果(选中此项){
aData.push([this.value,this.name]);
}
});
console.log(aData);
});
您正在更新并在回调函数中推送相同的数组引用。请改为在回调函数中使用局部变量,或直接生成数组并推送到
aData
数组
尽管您可以在回调中使用this
引用元素,因此不需要使用回调参数
var aData = [];
$(".providers_chk").each(function () {
if (this.checked) { // check the checked property
aData.push([this.value, this.name]);
}
});
$('.providers_chk').change(函数(){
变量aData=[];
$(“.providers_chk”)。每个(函数(){
如果(选中此项){
aData.push([this.value,this.name]);
}
});
console.log(aData);
});
将
var项=[];
移动到中,如果
:
if ($(this).attr("checked")) {
var item = [];
item[0] = element.value;
item[1] = element.name;
aData.push(item);
console.log(aData);
}
循环的每次迭代都在修改相同的项
数组。您推送到aData
的每个项
都只是对相同var项
的引用
一个较短的选项是根本不创建临时变量:
if ($(this).attr("checked")) {
aData.push([element.value, element.name]);
console.log(aData);
}
下面是一个例子来说明这个问题:
var item=['foo'];//就像您的'item'`
var列表=[];
while(列表长度<5)
list.push(item);//将其添加到列表中5次
log(JSON.stringify(list));
列表[0][0]=“bar”;//编辑列表内容中的第一个“项”
console.log(JSON.stringify(list));
将var项=[];
移动到中,如果:
if ($(this).attr("checked")) {
var item = [];
item[0] = element.value;
item[1] = element.name;
aData.push(item);
console.log(aData);
}
循环的每次迭代都在修改相同的项
数组。您推送到aData
的每个项
都只是对相同var项
的引用
一个较短的选项是根本不创建临时变量:
if ($(this).attr("checked")) {
aData.push([element.value, element.name]);
console.log(aData);
}
下面是一个例子来说明这个问题:
var item=['foo'];//就像您的'item'`
var列表=[];
while(列表长度<5)
list.push(item);//将其添加到列表中5次
log(JSON.stringify(list));
列表[0][0]=“bar”;//编辑列表内容中的第一个“项”
console.log(JSON.stringify(list));
在代码中,您只使用一个数组进行推送,每个循环都会得到新值。最后,当对同一对象的引用分布在结果数组上时,您在所有推送数组中都会得到相同的值
您可以动态创建数组,这些数组不通过引用链接在一起
var aData = [];
$(".providers_chk").each(function (index, element) {
if ($(this).attr("checked")) {
aData.push([element.value, element.name]);
console.log(aData);
}
});
在代码中,您只使用一个数组进行推送,这会为每个循环获取新值。最后,当对同一对象的引用分布在结果数组上时,您会在所有推送数组中获得相同的值
您可以动态创建数组,这些数组不通过引用链接在一起
var aData = [];
$(".providers_chk").each(function (index, element) {
if ($(this).attr("checked")) {
aData.push([element.value, element.name]);
console.log(aData);
}
});
希望它对你有用:)
希望它对您有用:)使用.map()
函数根据选择器的每个匹配元素返回一个数组。在回调中,您应该返回一个新数组,而不是重复使用代码中的相同数组
var aData = $('.providers_chk:checked').map(function() {
return [[this.value, this.name]];
}).get();
嵌套数组是必需的,因为jQuery会自动展平返回的数组,因此您必须将其包装在一个额外的级别中,以便在最终结果中获得一个二维数组。使用.map()
函数根据选择器的每个匹配元素返回一个数组。在回调中,您应该返回一个新数组,而不是重复使用代码中的相同数组
var aData = $('.providers_chk:checked').map(function() {
return [[this.value, this.name]];
}).get();
嵌套数组是必需的,因为jQuery会自动展平返回的数组,所以您必须将其包装在一个额外的级别中,以便在最终结果中得到一个二维数组。{“foo”,“bar”}
不是有效语法。您不需要if()
,您可以使用选择器。提供者\u chk:checked
{“foo”bar“}
不是有效语法。不需要if()
,你可以使用选择器。提供者。\u chk:checked
。jQuery.map
和:checked
选择器如何?不是很容易吗?顺便说一句,我不是被否决的选民。@Rayon:这是一个完全不同的答案。@Cerbrus-同意!不确定为什么会有这么多被否决的原因:(关于jQuery.map
和:选中的
选择器如何?)更简单,不是吗?顺便说一句,我不是下一个投票人。@Rayon:这是一个完全不同的答案。@Cerbrus-同意!不确定为什么这么多的下一个投票没有说明原因:(这可能会导致[“foo”,“bar”,“foo1”,“bar1”…)
…根据jQuery映射文档…如果返回数组,数组中的元素将插入集合。
哇,我不时了解jQuery的一些新情况。我添加了额外的包装。这可能会导致[“foo”、“bar”、“foo1”、“bar1”…]
…根据jQuery映射文档…如果返回数组,数组中的元素将插入集合。
哇,我不时了解jQuery的一些新内容。我添加了额外的包装。