我有对象数组:
const items = [{ search_type: 'environment',
search_code: 'TBA_ENVIRONMENT00002',
asset_code: 'ASSET00002' },
{ search_type: 'job',
search_code: 'TBA_JOB00002',
asset_code: 'ASSET00002' },
{ search_type: 'environment',
search_code: 'TBA_ENVIRONMENT00002',
asset_code: 'ASSET00004' },
{ search_type: 'job',
search_code: 'TBA_JOB00002',
asset_code: 'ASSET00004' },
{ search_type: 'job',
search_code: 'TBA_JOB00003',
asset_code: 'ASSET00004' },
{ search_type: 'scene',
search_code: 'TBA_SCENE00006',
asset_code: 'ASSET00002' },
];
并且想要返回类似于此的内容:
{
ASSET00002: {
environment:["TBA_ENVIRONMENT00002"],
job:["TBA_JOB00002"],
scene:["TBA_SCENE00006"]
},
ASSET00004: {
environment:["TBA_ENVIRONMENT00002"],
job:["TBA_JOB00002","TBA_JOB00003"]
},
}
我在这里使用Reduce函数使用此逻辑:
const result = items.reduce((acc, item) => {
const { search_type, search_code, asset_code } = item;
return {
...acc,
[asset_code]: {
...acc[asset_code], [search_type]: [search_code]
},
};
}, {});
我得到以下结果:
{
ASSET00002: {
environment:["TBA_ENVIRONMENT00002"],
job:["TBA_JOB00002"],
scene:["TBA_SCENE00006"]
},
ASSET00004: {
environment:["TBA_ENVIRONMENT00002"],
job:["TBA_JOB00003"]
},
}
这里返回“ ASSET00004”->“ job”我应该得到带有两个值的数组,但只有一个。我知道我的代码中缺少一些内容,但是找不到将值正确推入数组的方法。任何帮助将不胜感激。
您可以通过单个reduce
方法完成此操作,并确保在遍历对象时添加到任何现有数组上:
const items = [{ search_type: 'environment',
search_code: 'TBA_ENVIRONMENT00002',
asset_code: 'ASSET00002' },
{ search_type: 'job',
search_code: 'TBA_JOB00002',
asset_code: 'ASSET00002' },
{ search_type: 'environment',
search_code: 'TBA_ENVIRONMENT00002',
asset_code: 'ASSET00004' },
{ search_type: 'job',
search_code: 'TBA_JOB00002',
asset_code: 'ASSET00004' },
{ search_type: 'job',
search_code: 'TBA_JOB00003',
asset_code: 'ASSET00004' },
{ search_type: 'scene',
search_code: 'TBA_SCENE00006',
asset_code: 'ASSET00002' },
];
const assets = items.reduce((acc, el) => {
if (!acc[el.asset_code]) {
acc[el.asset_code] = {};
}
acc[el.asset_code][el.search_type] =
[...acc[el.asset_code][el.search_type] || [], el.search_code];
return acc;
}, {});
console.log(assets);