在将columnsData
值分配给columns
时,我有两个JSON对象columnsData
和columns
两个值都已更改。
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值如何更改?有没有其他方法来分配值
答案 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
裁判时,一个对象的属性更改将影响正在被引用的主对象。
试试这个:
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;
答案 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方法中添加逻辑,以根据需要创建新数组。希望能帮助到你。