Javascript对象包含旧数据
我试图根据状态选择从JSON字符串中筛选结果。我会更深入地解释。关于下面的代码,jsonstring包含整个javascript对象。我通过grep函数过滤状态,然后将结果添加到主对象(jsonstring)中,这样我就可以获得具有新过滤状态的整个javascript对象。但每次调用此下拉列表时,我都会得到最后更新的javascript对象,但每次调用此函数时,我都需要原始jsonstringJavascript对象包含旧数据,javascript,jquery,Javascript,Jquery,我试图根据状态选择从JSON字符串中筛选结果。我会更深入地解释。关于下面的代码,jsonstring包含整个javascript对象。我通过grep函数过滤状态,然后将结果添加到主对象(jsonstring)中,这样我就可以获得具有新过滤状态的整个javascript对象。但每次调用此下拉列表时,我都会得到最后更新的javascript对象,但每次调用此函数时,我都需要原始jsonstring function dropdownchange(jsonstring) { var e = docu
function dropdownchange(jsonstring)
{
var e = document.getElementById("documents_filter");
var svalue = e.options[e.selectedIndex].value;
if(svalue == "In Progress")
{
var docstatusfilter;
docstatusfilter = $.grep(jsonstring.Apps.statuslist , function(el, i) {
return el.DOCUMENT_STATUS === "In Progress"
});
jsonstring.Apps.statuslist = docstatusfilter;
}
if(svalue == "Auth (Verified)")
{
var authstatus;
authstatus = $.grep(jsonstring.Apps.statuslist , function(el, i) {
return el.DOCUMENT_STATUS === "Auth (Verified)"
});
jsonstring.Apps.statuslist = authstatus;
}
}
当这个函数第一次调用时,它工作得很好,但是一旦我更改了下拉列表,它就会包含jsonstring中的上一条记录,但是每次调用这个函数时,我都想要原始的jsonstring
有人知道吗
谢谢将原始字符串存储在单独的变量中。使用原始字符串变量作为函数的输入,然后将结果值设置为不同的变量。只需将jsonstring复制到另一个对象中,并在函数中使用该对象即可。这是一个将克隆对象的函数-
function clone(obj) {
var copy = jQuery.extend(true, {}, obj);
return copy;
}
现在按如下方式调用此函数:
function dropdownchange(jsonstring)
{
var newJsonString = clone(jsonstring);
var e = document.getElementById("documents_filter");
var svalue = e.options[e.selectedIndex].value;
......
....
只需在函数中使用
newJsonString
,而不是jsonstring
(这与您的问题没有直接关系,但是为什么要在不包含JSON(或非JSON字符串)的情况下命名变量jsonstring
)?调试使用有意义变量名的代码更容易。)谢谢..我放了一个示例..由于cmpny的隐私,我不能放原始代码。所以我把jsonstring放进去了,我想名字没有任何意义。如果你遵循命名惯例,我想你很好。好的,当然。鉴于jsonstring
是一个对象,您需要记住,当对象作为参数传递或分配给其他变量时,JS不会复制对象,而是传递/分配一个引用,因此jsonstring
引用的对象与您在dropdownchange()外部使用的任何变量相同
而您对jsonstring
所做的任何更改都将更改同一个对象。从其使用方式来看,jsonstring
是一个对象,而不是字符串(而不是JSON),因此只需将其分配给另一个变量,就会导致两个变量都引用同一个对象。谢谢Doug。不,我不能这样做。因为我必须基于jsonstring呈现整个html,而且我的代码中还有很多其他原因。如果你能给我任何一个很好的例子,你必须复制这个物体,所以有两个物体。关键是你不能编辑一个对象,然后期望得到它的原始状态。您需要复制对象的原始状态并引用该原始状态。此外,不确定为什么不能这样做。如果要渲染文档,请在渲染之前复制对象。我不知道我能给你什么样的代码示例——这个问题的范围比整个编程更广:为了获得某个东西的原始副本,你必须在编辑原始副本之前复制该副本。任何类型的文件或数据编辑也是如此。不过我知道这很难。谢谢道格。在进入下拉列表之前,我已经复制了对象,但仍然没有结果。var c=新对象();对于(var e in o){c[e]=o[e];}返回c;谢谢。我试过了,但还是不行。我不知道为什么即使我使用新的jsonstring,它仍然会改变jsonstring。有什么建议吗?它现在可以工作了。我用你的新克隆函数更新了克隆函数,它可以工作了。太棒了!!。另一件事是我把整个json都放到了“this”对象中,我很难把“this”传递到dropdown onchange事件中。因为“this”对象在dropdown change中的含义不同。有什么解决方法吗?我无法理解您的其他问题。你们能说得更清楚一点吗?我用你们的代码复制了对象后,成功地得到了答案。在我的应用程序中,我需要对对象进行3次复制,所以我只是想知道将来是否会出现性能问题?