Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript对象包含旧数据_Javascript_Jquery - Fatal编程技术网

Javascript对象包含旧数据

Javascript对象包含旧数据,javascript,jquery,Javascript,Jquery,我试图根据状态选择从JSON字符串中筛选结果。我会更深入地解释。关于下面的代码,jsonstring包含整个javascript对象。我通过grep函数过滤状态,然后将结果添加到主对象(jsonstring)中,这样我就可以获得具有新过滤状态的整个javascript对象。但每次调用此下拉列表时,我都会得到最后更新的javascript对象,但每次调用此函数时,我都需要原始jsonstring function dropdownchange(jsonstring) { var e = docu

我试图根据状态选择从JSON字符串中筛选结果。我会更深入地解释。关于下面的代码,jsonstring包含整个javascript对象。我通过grep函数过滤状态,然后将结果添加到主对象(jsonstring)中,这样我就可以获得具有新过滤状态的整个javascript对象。但每次调用此下拉列表时,我都会得到最后更新的javascript对象,但每次调用此函数时,我都需要原始jsonstring

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次复制,所以我只是想知道将来是否会出现性能问题?