数据操作javascript
我需要帮助将一些数组转换为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", },
[
{
"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函数,但这很清楚,谢谢您的回答