使用javascript数组填充JSON并修改条目

时间:2015-08-13 17:06:27

标签: javascript arrays json

使用以下代码修改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

我正在寻找一种干净的方法来在名称数组中实现正确的单一修改,因为我希望避免循环来执行此操作。

感谢您的帮助

3 个答案:

答案 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