数据操作javascript

数据操作javascript,javascript,arrays,json,Javascript,Arrays,Json,我需要帮助将一些数组转换为JavaScript中所需的格式,但我不知道如何处理它 基本上,我需要按对象中的一些字段对数据进行分组。你能给我一些建议吗 以下是我的数据: [ { "id": 52, "subId": 42, "title": "test title", "languageId": 27, "source": "test template lang 27", "input": "2", "output": "2", },

我需要帮助将一些数组转换为JavaScript中所需的格式,但我不知道如何处理它

基本上,我需要按对象中的一些字段对数据进行分组。你能给我一些建议吗

以下是我的数据:

[
  {
    "id": 52,
    "subId": 42,
    "title": "test title",
    "languageId": 27,
    "source": "test template lang 27",
    "input": "2",
    "output": "2",
  },
  {
    "id": 52,
    "subId": 42,
    "title": "test title",
    "languageId": 27,
    "source": "test template lang 27",
    "input": "1",
    "output": "1",
  },
  {
    "id": 52,
    "subId": 42,
    "title": "test title",
    "languageId": 27,
    "source": "test template lang 27",
    "input": "3",
    "output": "3",
  },
  {
    "id": 52,
    "subId": 42,
    "title": "test title",
    "languageId": 29,
    "source": "test template of lang 29",
    "input": "2",
    "output": "2",
  },
  {
    "id": 52,
    "subId": 42,
    "title": "test title",
    "languageId": 29,
    "source": "test template of lang 29",
    "input": "1",
    "output": "1",
  },
  {
    "id": 52,
    "subId": 42,
    "title": "test title",
    "languageId": 29,
    "source": "test template of lang 29",
    "input": "3",
    "output": "3",
  },
  {
    "id": 52,
    "subId": 53,
    "title": "test title 2",
    "languageId": 22,
    "source": "test template lang 22",
    "input": "2",
    "output": "2",
  },
  {
    "id": 52,
    "subId": 53,
    "title": "test title 2",
    "languageId": 22,
    "source": "test template lang 22",
    "input": "3",
    "output": "3",
  },
  {
    "id": 52,
    "subId": 53,
    "title": "test title 2",
    "languageId": 16,
    "source": "test template lang 16",
    "input": "2",
    "output": "2",
  },
  {
    "id": 52,
    "subId": 53,
    "title": "test title 2",
    "languageId": 16,
    "source": "test template lang 16",
    "input": "3",
    "output": "3",
  }
]
我想输出:

[
    {
        "id": 52,
        "subId": 42,
        "title": "test title",
        "lang": [
            {"languageId": 27, "source": "test template lang 27"},
            {"languageId": 29, "source": "test template of lang 29"}
        ],
        "testCases": [
            {"input": "2","output": "2"},
            {"input": "1","output": "1"},
            {"input": "3","output": "3"}
        ]
    },
        {
        "id": 52,
        "subId": 53,
        "title": "test title",
        "lang": [
            {"languageId": 22, "source": "test template lang 22"},
            {"languageId": 16, "source": "test template of lang 16"}
        ],
        "testCases": [
            {"input": "2","output": "2"},
            {"input": "2","output": "3"}
        ]
    }
]
简而言之,我需要根据langid和testcase对这些数据进行分组。你能帮我解决这个问题吗


谢谢。

您可以使用函数
reduce
按特定键对元素进行分组,使用函数
Object.values
将分组的元素作为数组

这种方法假设
标题可以是任何可能的值

let arr=[{“id”:52,“subId”:42,“title”:“test title”,“languageId”:27,“source”:“test template lang 27”,“input”:“2”,“output”:“2”,},{“id”:52,“subId”:42,“title”:“test title”,“languageId”:27,“source”:“test template lang 27”,“input”:“1”,“output”:“1”,},{“id”:52,“subId”:42,“title”:“test title”,“languageId”:27,“source”:“test template lang 27”,“input”:“3”,“output”:“3”,},{“id”:52,“subId”:42,“title”:“test title”,“languageId”:29,“source”:“test template of lang 29”,“input”:“2”,“output”:“2”,},{“id”:52,“subId”:42,“title”:测试标题,“languageId”:29,“源”:“Lang29的测试模板”,“输入”:“1”,“输出”:“1”,},{“id”:52,“subId”:42,“标题”:“测试标题”,“languageId”:29,“源”:“Lang29的测试模板”,“输入”:“3”,“输出”:“3”,},{“id”:52,“subId”:53,“标题”:“测试标题2”,“languageId”“:22,“源”:“测试模板语言22”,“输入”:“2”,“输出”:“2”},{“id”:52,“子id”:53,“标题”:“测试标题2”,“语言id”:22,“源”:“测试模板语言22”,“输入”:“3”,“输出”:“3”},{“id”:52,“子id”:53,“标题”:“测试标题2”,“语言id”:16,“源”:“测试模板语言16”,“输入”:“2”,“输出”:“2”,},{“id”:52,“subId”:53,“标题”:“测试标题2”,“语言id”:16,“源”:“测试模板语言16”,“输入”:“3”,“输出”:“3”,}];
让result=Object.values(arr.reduce((r,{id,subId,title,languageId,source,input,output})=>{
r[subId]=r[subId]|{id,subId,title,lang:[],testCases:[]};
r[subId].lang=Object.values(r[subId].lang.reduce((a,{languageId,source})=>{
a[languageId]={languageId,source};
返回a;
},{[languageId]:{languageId,source}});
r[subId].testCases=Object.values(r[subId].testCases.reduce((a,{input,output})=>{
a[`${input}|${output}`]={input,output};
返回a;
},{[`${input}|${output}`]:{input,output}});
返回r;
}, {}));
console.log(结果);

.as console wrapper{max height:100%!important;top:0;}
您可以使用
reduce
方法通过多个键进行分组,例如
id
subId

const result = [...data.reduce((r, o) => {    
  const key = o.id + '-' + o.subId;    
  const item = r.get(key) || { id: o.id, subId: o.subId, title: o.title, 
      lang: [], testCases: []  };
  if (!item.lang.find(f => f.languageId == o.languageId && f.source == o.source))
      item.lang.push({ languageId: o.languageId, source: o.source  });

  if (!item.testCases.find(f => f.input == o.input && f.output == o.output))
      item.testCases.push({ input: o.input, output: o.output  });

  return r.set(key, item);
}, new Map).values()];
例如:

let数据=[
{
“id”:52,
“subId”:42,
“标题”:“测试标题”,
“languageId”:27,
“来源”:“测试模板语言27”,
“输入”:“2”,
“输出”:“2”,
},
{
“id”:52,
“subId”:42,
“标题”:“测试标题”,
“languageId”:27,
“来源”:“测试模板语言27”,
“输入”:“1”,
“输出”:“1”,
},
{
“id”:52,
“subId”:42,
“标题”:“测试标题”,
“languageId”:27,
“来源”:“测试模板语言27”,
“输入”:“3”,
“输出”:“3”,
},
{
“id”:52,
“subId”:42,
“标题”:“测试标题”,
“languageId”:29,
“来源”:“朗29测试模板”,
“输入”:“2”,
“输出”:“2”,
},
{
“id”:52,
“subId”:42,
“标题”:“测试标题”,
“languageId”:29,
“来源”:“朗29测试模板”,
“输入”:“1”,
“输出”:“1”,
},
{
“id”:52,
“subId”:42,
“标题”:“测试标题”,
“languageId”:29,
“来源”:“朗29测试模板”,
“输入”:“3”,
“输出”:“3”,
},
{
“id”:52,
“subId”:53,
“标题”:“测试标题2”,
“languageId”:22,
“来源”:“测试模板语言22”,
“输入”:“2”,
“输出”:“2”,
},
{
“id”:52,
“subId”:53,
“标题”:“测试标题2”,
“languageId”:22,
“来源”:“测试模板语言22”,
“输入”:“3”,
“输出”:“3”,
},
{
“id”:52,
“subId”:53,
“标题”:“测试标题2”,
“languageId”:16,
“来源”:“测试模板语言16”,
“输入”:“2”,
“输出”:“2”,
},
{
“id”:52,
“subId”:53,
“标题”:“测试标题2”,
“languageId”:16,
“来源”:“测试模板语言16”,
“输入”:“3”,
“输出”:“3”,
}
];
const result=[…data.reduce((r,o)=>{
const key=o.id+'-'+o.subId;
const item=r.get(key)|{id:o.id,subId:o.subId,title:o.title,
lang:[],testCases:[]};
if(!item.lang.find(f=>f.languageId==o.languageId&&f.source==o.source))
item.lang.push({languageId:o.languageId,source:o.source});
if(!item.testCases.find(f=>f.input==o.input&&f.output==o.output))
push({input:o.input,output:o.output});
返回r.set(键、项);
},新映射)。值();

console.log(result);
您尝试了什么?至少搜索了现有的分组答案?请一定带些东西来这里,这不是一个代码编写服务。这回答了您的问题吗?我仍在尝试理解js中的reduce函数,但这很清楚,谢谢您的回答