今天我遇到了一个非常有趣的问题,很多人可能会发现这些问题很简单,但由于我刚学会使用jQuery,我很想知道它是如何工作的。
我有两个数组,我在迭代数组元素。一个数组是arrAllDetailsConstantData
,另一个数组是arrAllDetails
。我想使用 arrAllDetails 比较 arrAllDetailsConstantData 和更新。
我正在使用嵌套循环。但正在发生的是,在更新数组 arrAllDetails 时,数组 arrAllDetailsConstantData 也会更新。我认为这与父母的范围有某种关系(尽管我只是猜测)。你能帮帮我吗?
这是我的代码:
$.each(privateVariables.arrAllDetailsConstantData, function() {
if (this.AssociationId == value && this.uniqueChargeAttr == uniqueChargeAttr) {
if (this.Units == $("#txtUnits").val() &&
this.Modifier1 == $("#txtModifier1").val() &&
this.Modifier2 == $("#txtModifier2").val() &&
this.Modifier3 == $("#txtModifier3").val() &&
this.Modifier4 == $("#txtModifier4").val() &&
this.DxOption == $("#ddlDxOption").val() &&
this.DxCode1 == $("#txtDx1").val() &&
this.DxCode2 == $("#txtDx2").val() &&
this.DxCode3 == $("#txtDx3").val() &&
this.DxCode4 == $("#txtDx4").val()) {
} else {
$.each(arrAllDetails, function() {
if (this.AssociationId == value && this.uniqueChargeAttr == uniqueChargeAttr) {
this.ActionType = "M";
this.CptName = $("#lblCptDesc").text();
this.CptDesc = $("#lblCptDesc").text();
this.Units = $("#txtUnits").val();
this.Modifier1 = $("#txtModifier1").val();
this.Modifier2 = $("#txtModifier2").val();
this.Modifier3 = $("#txtModifier3").val();
this.Modifier4 = $("#txtModifier4").val();
this.DxOption = $("#ddlDxOption").val();
this.DxCode1 = $("#txtDx1").val();
this.DxCode2 = $("#txtDx2").val();
this.DxCode3 = $("#txtDx3").val();
this.DxCode4 = $("#txtDx4").val();
privateVariables.arrActionData.push(this);
}
});
}
}
});
// test code ends
答案 0 :(得分:1)
this
引用调用元素。在$.each
中,这是指迭代元素。
因此,在您的第一个循环中:$.each(privateVariables.arrAllDetailsConstantData, function() {});
,this
将是arrAllDetailsConstantData
数组的当前循环元素。
在第二个循环中,this
将是arrAllDetails
数组的当前循环元素。
请勿忘记,在许多语言中,如果使用此arrAllDetailsConstantData = arrAllDetails
,则指向这两个对象的指针指向相同的内存范围。
在这种情况下,请使用arrAllDetailsConstantData = arrAllDetails.slice();
中的Array.prototype.slice
。
答案 1 :(得分:0)
对于"这个"的范围你可以查看JQuery and 'this' object
至于你的代码:你需要首先添加你创建两个数组的方式。
根据您的代码,它们似乎是通过使用相同的元素创建的(因此arrDetails似乎是arrAllDetails中对象的子集)。
的方式$.each(arrDetails, function() {arrAllDetails.push(this); });
或简单地说:
arrDetails = arrAllDetails;
如果是这种情况,则数组中的对象实际上是SAME。因此,编辑一个数组中的元素也会在另一个数组中编辑它(它们指向内存中的同一个对象)。
我不确定你要完成什么,但是如果你想让对象不同,你需要克隆这些条目,使它们成为单独的对象,而不仅仅是使用它们。
除此之外,您对此的基本理解(适用于最近的范围)是正确的,但被其他问题所覆盖。
答案 2 :(得分:0)
在Javascript this
中指的是函数执行的所有者。知道所有者实际上是什么并不总是容易的。通过HTML-Elements的范围,this
通常引用元素本身。迭代内部(如$.each(data, function)
)this
指的是迭代的项目。
您在2个不同的上下文中使用this
。每次都在另一次迭代中。
$.each(privateVariables.arrAllDetailsConstantData, function() {
if (this.AssociationId == value && this.uniqueChargeAttr == uniqueChargeAttr) {
//in this context: "this" refers to the currently selected
//item of the iteration over:
// privateVariables.arrAllDetailsConstantData
} else {
$.each(arrAllDetails, function() {
// in this context: "this" refers to the selected item
// of the iteration over "arrAllDetails"
});
}
});
通过将this
绑定到局部变量,可以在输入迭代时保留上下文。
$.each(privateVariables.arrAllDetailsConstantData, function() {
if (this.AssociationId == value && this.uniqueChargeAttr == uniqueChargeAttr) {
// this refers to an item from privateVariables.arrAllDetailsConstantData
} else {
var context = this;
$.each(arrAllDetails, function() {
// context refers to an item from privateVariables.arrAllDetailsConstantData
// so: use
context.AssociationId
// instead of
this.AssociationId
});
}
});