如何展开 JSON 对象并合并相似的键?

How to unflatten a JSON object and merge similar keys?

我有给定格式的 JSON :

{
"literature":
[
  {
   "category": "medical",
   "title": "med title",
   "abstract":"med abstract"
  },
  {
  "category": "medical",
  "title": "med title2",
  "abstract":"med abstract2"
  },
  {
  "category": "economics",
  "title": "eco title",
  "abstract":"eco abstract"
  },
  {
  "category": "science",
  "title": "sci title",
  "abstract":"sci abstract"
  }
]
  }

期望的输出:

{
"literature":
[
  {
"medical":
[
  {
   "title": "med title",
   "abstract":"med abstract"
  },
  {
  "title": "med title2",
  "abstract":"med abstract2"
  }
]
},
  {
  "economics":
[
  {
  "title": "eco title",
  "abstract":"eco abstract"
  }
 ]
},
  {
  "science":
   [
     {
  "title": "sci title",
  "abstract":"sci abstract"
     }
   ]
  }
]
}

我会使用 JSON.parse() 将 JSON 转换为 javascript 对象,然后修改该对象,将类别属性作为键并将数据合并到相似键中如上图所示。这三天以来我很震惊,请帮帮我。

创建新对象并使用 for...of 重写值

const response = {
"literature":
[
  {
   "category": "medical",
   "title": "med title",
   "abstract":"med abstract"
  },
  {
  "category": "medical",
  "title": "med title2",
  "abstract":"med abstract2"
  },
  {
  "category": "economics",
  "title": "eco title",
  "abstract":"eco abstract"
  },
  {
  "category": "science",
  "title": "sci title",
  "abstract":"sci abstract"
  }
]
  }
  
function groupByCategory(items) {
 const grouped = {}
 for(const item of items) {
  grouped[item.category] = grouped[item.category] || [];
  const itemCopy = { ...item };
  delete itemCopy.category
  grouped[item.category].push(itemCopy)
 }
 
 console.log(grouped)
}

groupByCategory(response.literature)

您可以使用 reduce 轻松完成,如下所示

const rawData = {"literature":[{"category":"medical","title":"medtitle","abstract":"medabstract"},{"category":"medical","title":"medtitle2","abstract":"medabstract2"},{"category":"economics","title":"ecotitle","abstract":"ecoabstract"},{"category":"science","title":"scititle","abstract":"sciabstract"}]}

function formatData(data) {
  return Object.keys(data).reduce((acc, key) => {
      acc[key] = data[key].reduce((groups, {category, ...rest}) => {
      if (!groups[category]) {
        groups[category] = [];
      }
      groups[category].push(rest);
      return groups;
    }, {});
    return acc;
  }, {});
}

const result = formatData(rawData);

console.log(result)