使用以下代码修改JSON数组(嵌套到另一个数组中)似乎是NOK:
var names = [{'name': 'ourname'},{'name': 'yourname'}] ;
var array = [{
"year": "2015",
names
},{
"year": "2016",
names
}];
我无法在"数组"中修改单个名称条目通过这样做
array[0].names[1].name="MY NAME"
因为它实际上修改了行中的所有名称条目" 0":
输出:
0:0 ourname
0:1 MY NAME
1:0 ourname
1:1 MY NAME
Plunker here
我正在寻找一种干净的方法来在名称数组中实现正确的单一修改,因为我希望避免循环来执行此操作。
感谢您的帮助
答案 0 :(得分:2)
因为它们指向同一个数组,而且仅仅通过names
克隆.slice
是不够的,因为数组包含objects
而不是基本类型,所以你需要深入从原始names
克隆并分配给每个对象。
因此,您需要将代码更改为:
var array = [{
"year": "2015",
names: JSON.parse(JSON.stringify(names))
}, {
"year": "2016",
names: JSON.parse(JSON.stringify(names))
}];
查看已修改的pluker。
我使用JSON.parse(JSON.stringify(names))
来简单地从原始数组创建深度克隆,可以有其他方法。
答案 1 :(得分:0)
你应该尝试复制一下名字数组,一次为每个"唯一的"用例,因为Javascript有时会偷偷地提及引用。
这样做的一种方法是编写一个deepclone()
方法来执行分层对象的深层复制。
var array = [{
"year": "2015",
names: deepclone(names)
},{
"year": "2016",
names: deepclone(names)
}];
答案 2 :(得分:0)
您需要一个键:对象中的值(javascript对象)。
var names = [{'name': 'ourname'},{'name': 'yourname'}] ;
var array = [{
"year": "2015",
"names": names
},{
"year": "2016",
"names": names
}];
var wName = array[0].names[1].name;
// yourname