减少函数推入数组的值

问题描述 投票:1回答:1

我有对象数组:

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”我应该得到带有两个值的数组,但只有一个。我知道我的代码中缺少一些内容,但是找不到将值正确推入数组的方法。任何帮助将不胜感激。

javascript reduce
1个回答
0
投票

您可以通过单个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);
© www.soinside.com 2019 - 2024. All rights reserved.