JSON扩展而不会覆盖具有相同名称的属性

时间:2018-09-12 08:26:01

标签: javascript json node.js extend

我需要扩展JSON数据。现在我有两个对象:

const obj1 = {
   "data": [
      {
         "fruit num": 1,
         "kind": "sweet"
      },
      {
         "fruit num": 2,
         "kind": "sour"
      }
   ]
}

const obj2 = {
   "data": [
      {
         "fruit num": 3,
         "kind": "bitter"
      },
      {
         "fruit num": 4,
         "kind": "bitter"
      }
   ]
}

我需要做的是制作一个看起来像这样的obj3文件:

const obj3 = {
   "data": [
      {
         "fruit num": 1,
         "kind": "sweet"
      },
      {
         "fruit num": 2,
         "kind": "sour"
      },
      {
         "fruit num": 3,
         "kind": "bitter"
      },
      {
         "fruit num": 4,
         "kind": "bitter"
      }
   ]
}

当我尝试使用 obj3 = obj1.concat(obj2)时-它说没有这样的功能。

当我尝试使用 obj3 = Object.assign(obj1,obj2)时-它会覆盖JSON文件,然后只剩下2个结果。

当我尝试使用 obj3.data = Object.assign(obj1.data,obj2.data)时-它不会更改任何内容。

是的,{data:[]}在这里是必须的。

如何扩展JSON对象而不覆盖它?

P.S。我在这里使用Node 8。

2 个答案:

答案 0 :(得分:3)

您需要显式组合data数组来做到这一点:

const obj3 = { data: [...obj1.data, ...obj2.data] };

如果您还希望将两个对象合并成obj3的其他属性,则可以Object.assign并传递由合并的data组成的第三个对象:< / p>

const obj3 = Object.assign({}, obj1, obj2, { data: [...obj1.data, ...obj2.data] });

或更简洁地说,对象传播:

const obj3 = {
  ...obj1,
  ...obj2,
  data: [...obj1.data, ...obj2.data]
};

答案 1 :(得分:1)

您的$result = ['one' => ['two' => ['free' => 10]]]; 不起作用,因为concatobj1都不是数组。您需要使用obj2来做到这一点,

data