在打字稿中合并具有相同值的JSON数据

时间:2018-07-04 05:16:51

标签: json angular typescript

我有一个从URL获取的JSON数据。我要合并具有相同值的数据,下面是示例数据。我已经通过Internet搜索了,但是没有解决方案。我发现的只是用于相同的键

.targets

我想将 [ { "banana": [ { "color": yellow, "size": "small" }, { "size": "medium" }, { "size": "large" } ], "process_name": "fruits"},{ "carnivores": [ { "name": "lion" }, { "name": "tiger" }, { "name": "chetah" }, { "name": "dianosaur" } ], "process_name": "animal"}, { "apple": [ { "color": red, "size": "large" } ], "process_name": "fruits"}] 的数据合并到一个数组中,如下所示,结果应该是

"process_name" :"fruits"

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

只需一些片段即可开始

// data definition
const json_before = [ {
  "banana": [
    {
      "color": "yellow",
      "size": "small"
    },
    {
      "size": "medium"
    },
    {
      "size": "large"
    }
  ],
  "process_name": "fruits"},
{
  "carnivores": [
    {
      "name": "lion"
    },
    {
      "name": "tiger"
    },
    {
      "name": "chetah"
    },
    {
      "name": "dianosaur"
    }
  ],
  "process_name": "animal"},
{
  "apple": [
    {
      "color": "red",
      "size": "large"
    }
  ],
  "process_name": "fruits"
}];

// processing
const json_after = json_before.reduce((arr, next) => {
  const exist = arr.find(el => el.process_name === next.process_name);
  if (exist) Object.assign(exist, next);
  else arr.push(next);
  return arr;
}, []);

// check
console.log(json_after);

主要思想是使用reduce进行数组遍历。为了缩短处理代码,我使用了Object.assign来修改以前添加的元素,尽管在实际代码中最好使用Object.keys并手动检查先前对象的属性是否未被覆盖。 / p>

请注意,这正在使源数据变异(通过添加console.log(json_before)进行检查)。同样,如果您不想这样做,则应该自己克隆每个元素,而无需直接分配对象。