JSON对象键的值变化会影响其他值的变化问题

3

描述:已经定义了一个 JSON 对象作为全局变量。var JSON_OBJECT = [];

[
{
    "user_id": "123",
    "AF": [
        {
            "formula_type": 0,
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
},
{
    "user_id": "859",
    "AF": [
        {
            "formula_type": 0,
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
}
]

JSON对象 (JSON_OBJECT) 由一个函数构造:jsonCreator

function jsonCreator() {

var af_Array = [];
var Trend_Array = [];
var selectedUsers = ['123','859','235']

for (var i = 0; i < 1; i++) {
    var af_keys = {}
    af_keys.formula_type = i;
    af_keys.lag = i;
    af_Array.push(af_keys);
}

for (var j = 0; j < 1; j++) {
    var trends_keys = {}
    trends_keys.is_active = j;
    Trend_Array.push(trends_keys);
}


for (var indexUsers = 0; indexUsers < selectedUsers.length; indexUsers++) {
    var jsonObj = {};
    jsonObj.user_id = selectedUsers[indexUsers]['rowId'];
    jsonObj.AF = af_Array;
    jsonObj.Trend = Trend_Array;
    JSON_OBJECT.push(jsonObj);
}
};

问题陈述: 更改user_id:123formula_type值。

尝试过的代码

var currentUserID = '123';
var formulaType = 'FORMULA-1'

Object.keys(JSON_OBJECT).forEach(function(k) {
if (currentUserID == JSON_OBJECT[k]['user_id']) {
    JSON_OBJECT[k]['AF'][0]['formula_type'] = formulaType;
}
});

问题描述: 上述代码更改了user_id:123user_id:859formula_type值。

生成的JSON结果

[
{
    "user_id": "123",
    "AF": [
        {
            "formula_type": 'FORMULA-1',
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
},
{
    "user_id": "859",
    "AF": [
        {
            "formula_type": 'FORMULA-1',
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
}
]

需要帮助,谢谢。

var JSON_OBJECT = [
{
    "user_id": "123",
    "AF": [
        {
            "formula_type": 0,
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
},
{
    "user_id": "859",
    "AF": [
        {
            "formula_type": 0,
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
}
];

var currentUserID = '123';
var formulaType = 'FORMULA-1'

Object.keys(JSON_OBJECT).forEach(function(k) {
  if (currentUserID == JSON_OBJECT[k]['user_id']) {
      JSON_OBJECT[k]['AF'][0]['formula_type'] = formulaType;
  }
});
console.log(JSON_OBJECT);


你能试试将data[0].AF[0].formula_type = "3";赋值给JSON数据中的data吗? - Aravind S
1
你的代码可以运行,看一下这段代码片段。现在有什么问题吗? - Ankit Agarwal
2
这可能是JSON_OBJECT创建方式的问题。那两个AF值很可能引用了同一个数组,或者AF数组中的元素引用了同一个对象。当然,如果使用正确的json对象,这种情况不应该发生,但如果您自己创建这些对象,则可能存在错误。 - ccarton
2
是的,问题出在创建上。这一行:jsonObj.AF = af_Array; 并没有复制,它只是分配了一个引用。所有的 AF 字段都引用同一个 af_Array 对象。你需要进行深度复制。Trend_Array 的赋值也是如此。 - ccarton
1
如果您不确定如何进行深拷贝,最简单的方法是将其转换为json字符串。例如,当创建af_Array时,请将其保存为字符串af_Array_str = JSON.stringify(af_Array),然后在创建对象时使用jsonObj.AF = JSON.parse(af_Array_str) - ccarton
显示剩余3条评论
5个回答

3
问题出在创建JSON的过程中,即jsonCreator()。第jsonObj.AF = af_Array;行没有进行复制,而只是分配了一个引用。
解决方案是,借鉴@ccarton的建议,将JSON_OBJECT转换为字符串并重新解析。
var currentUserID = '123';
var formulaType = 'FORMULA-1'

var JSON_OBJECT1 = JSON.stringify(JSON_OBJECT); 
JSON_OBJECT = JSON.parse(JSON_OBJECT1)

Object.keys(JSON_OBJECT).forEach(function(k) {
if (currentUserID == JSON_OBJECT[k]['user_id']) {
    JSON_OBJECT[k]['AF'][0]['formula_type'] = formulaType;
}
});

3

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
    
        var currentUserID = '123';
  var formulaType = 'FORMULA-1';
        
        var JSON_OBJECT = '[{    "user_id": "123",    "AF": [        {            "formula_type": 0,            "lag": 0        }    ],    "Trend": [        {            "is_active": 0        }    ]},{    "user_id": "859",    "AF": [        {            "formula_type": 0,            "lag": 0        }    ],    "Trend": [        {            "is_active": 0        }    ]}]';

        var obj = jQuery.parseJSON(JSON_OBJECT);
       // var obj1 = jQuery.parseJSON(JSON_OBJECT);
$.each(obj, function(k,value) {
  if(value.user_id == currentUserID){
    JSON_OBJECT.AF = formulaType;
    obj[k]['AF'][0]['formula_type'] = formulaType;
  }
}) 
  var myJSON = JSON.stringify(obj); 
        console.log(myJSON)
  
});
</script>


2

使用数组 map() 方法:

var jsonObj = [
{
    "user_id": "123",
    "AF": [
        {
            "formula_type": 0,
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
},
{
    "user_id": "859",
    "AF": [
        {
            "formula_type": 0,
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
}
];

var currentUserID = '123';
var formulaType = 'FORMULA-1';

jsonObj.map(obj => {
  if (obj.user_id == currentUserID) {
    for (var i in obj["AF"]) {
      obj["AF"][i].formula_type = formulaType;
    }
  }
});

console.log(jsonObj);

使用JavaScript的for ... in循环:

var jsonObj = [
{
    "user_id": "123",
    "AF": [
        {
            "formula_type": 0,
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
},
{
    "user_id": "859",
    "AF": [
        {
            "formula_type": 0,
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
}
];

var currentUserID = '123';
var formulaType = 'FORMULA-1';

for (var i in jsonObj) {
  if (jsonObj[i]["user_id"] == currentUserID) {
    for (var j in jsonObj[i]["AF"]) {
      jsonObj[i]["AF"][j].formula_type = formulaType;
    }
  }
}

console.log(jsonObj);


1
尝试以下操作:
if (JSON_OBJECT.length > 0) {
    JSON_OBJECT.forEach(function(obj, index) {
    if (obj.user_id == 123) {
        if (obj.hasOwnProperty('AF')) {
        obj.AF.forEach(function(obj, index) {
            if (obj.hasOwnProperty('formula_type')) {
            obj.formula_type = 'FORMULA-1';
          }
        });
        }
    }

  });
}

解释:这里的JSON_OBJECT是一个对象数组。因此我们需要先循环进入数组。

JSFiddle


1
以下代码片段有效:

var JSON_OBJECT = [
{
    "user_id": "123",
    "AF": [
        {
            "formula_type": 0,
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
},
{
    "user_id": "859",
    "AF": [
        {
            "formula_type": 0,
            "lag": 0
        }
    ],
    "Trend": [
        {
            "is_active": 0
        }
    ]
}
];

var currentUserID = '123';
var formulaType = 'FORMULA-1'

Object.keys(JSON_OBJECT).forEach(function(k) {
  if (currentUserID == JSON_OBJECT[k]['user_id']) {
      JSON_OBJECT[k]['AF'][0]['formula_type'] = formulaType;
  }
});
console.log(JSON_OBJECT);

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接