旧JSON值已更改

时间:2016-01-29 05:31:29

标签: javascript jquery json

在将columnsData值分配给columns时,我有两个JSON对象columnsDatacolumns两个值都已更改。

var columnsData = [
      {id: "id"},      
      {id: "root_task_assignee"},
      {id: "root_task_id"},
      {id: "root_task_status"},
      {id: "root_task_tracker"},
      {id: "rt_category"},
      {id: "rt_priority"},
      {id: "rt_subject"},
]
var columns = [];

使用以下函数我将columnsData值分配给columns对象,并添加了一些其他字段

for(i = 0;i < columnsData.length; i++){
    columns[i] = columnsData[i];
    columns[i]["name"] = columnsData[i]["name"] || columnsData[i]["id"];
    columns[i]["type"] = columnsData[i]["id"]["type"] || "string";
} 

但在分配后两者具有相同的值。旧的JSON columnsData值如何更改?有没有其他方法来分配值

3 个答案:

答案 0 :(得分:2)

columns[i] = columnsData[i]不会复制数据,它会对相同的数据进行额外的引用。

例如,假设你给Random Jones先生一个绰号,&#34; Cozy&#34;。如果你给Cozy一个信封,如果琼斯先生现在还拿着一个信封,你会感到惊讶吗?

这里也是一样的。如果您更改columns[i],则还会更改columnsData[i],因为它们是同一个对象。

如果你想让它们与众不同,你必须克隆它。在这种情况下,您只需使用id创建一个新对象:

columns[i] = { id: columnsData[i].id };

一般来说,你最好找一个不错的clone函数。

答案 1 :(得分:1)

  

columns[i] = columnsData[i]不会将内容从一个对象复制到另一个对象,但会引用columnsData[i]。当他们向同一object裁判时,一个对象的属性更改将影响正在被引用的主对象。

试试这个:

&#13;
&#13;
var columnsData = [{
  id: "id"
}, {
  id: "root_task_assignee"
}, {
  id: "root_task_id"
}, {
  id: "root_task_status"
}, {
  id: "root_task_tracker"
}, {
  id: "rt_category"
}, {
  id: "rt_priority"
}, {
  id: "rt_subject"
}, ]
var columns = [];
for (i = 0; i < columnsData.length; i++) {
  var obj = {};
  obj["name"] = columnsData[i]["name"] || columnsData[i]["id"];
  obj["type"] = columnsData[i]["id"]["type"] || "string";
  columns.push(obj)
}
alert(JSON.stringify(columns));
alert(JSON.stringify(columnsData));
&#13;
&#13;
&#13;

答案 2 :(得分:1)

如果需要保持原始数组纯(未更改),我们应该使用数组的 map 方法。

var columnsData = [
  {id: "id"},      
  {id: "root_task_assignee"},
  {id: "root_task_id"},
  {id: "root_task_status"},
  {id: "root_task_tracker"},
  {id: "rt_category"},
  {id: "rt_priority"},
  {id: "rt_subject"},
]

 var columns = columnsData.map(function(obj){ 
    var rObj = {};
    rObj[obj.key] = obj.value;
    rObj["name"] = obj.value;
    .....
    return rObj;
});

可以在map方法中添加逻辑,以根据需要创建新数组。希望能帮助到你。