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

4

4 回答 4

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);

于 2019-12-05T00:30:38.350 回答
0

问题是,因为这条线

[asset_code]: {
 ...acc[asset_code], [search_type]: [search_code]
},

您正在丢失存储在 search_type 数组中的先前值的上下文,并且它仅采用您推送给它的最新值。

我们需要检查对象中是否已经存在数组键,如果不存在,则创建一个新数组,或者如果存在,则将其推送到同一个数组。

代码可以修改如下。

const result = items.reduce((acc, item, i) => {
  const { search_type, search_code, asset_code } = item;
  return {
    ...acc,
    [asset_code]: {
      ...acc[asset_code],
      [search_type]: acc[asset_code] && acc[asset_code][search_type] ?
       acc[asset_code][search_type].concat([search_code]) : [search_code]
    }
  };
}, {});

在上面的代码中,我们正在检查值是否已经存在于数组中,如果存在则将其连接起来。

于 2019-12-05T00:56:44.357 回答
0

非 ES6 解决方案。

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' },
 ];


  var result = {};
   items.forEach( function (item) {            
      result[item.asset_code]  = result[item.asset_code] || {};
      if(result[item.asset_code][item.search_type]){
        result[item.asset_code][item.search_type].push(item.search_code);
      }else{
        result[item.asset_code][item.search_type] = new Array(item.search_code)
      }
   });

   console.log(result);

于 2019-12-05T01:01:26.073 回答
0

因此,您不会向search_type密钥添加任何内容。

下面的代码使用扩展运算符添加到数组中。

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"]
},
}*/

const res = items.reduce((acc, {asset_code, search_type, search_code}) => ({
  ...acc,
  [asset_code]: {
    ...acc[asset_code],
    [search_type]: [
      // this is where you add to your array, this doesn't guarentee uniqueness however
      ...(acc[asset_code] && acc[asset_code][search_type] || []),
      search_code
    ] 
  }
}), {})

console.log(res)

于 2019-12-05T00:58:30.797 回答