首页 > 解决方案 > 如何按其中一个字段对数组对象进行分组?

问题描述

我正在尝试通过从另一个数组列表中过滤来重组数组。

包含过滤器的数组:

const filteringTags: [
    'Kitchen',
    'Accessories',
    ...
]

我想操作的数组:

[
    {
        category: 'free',
        date: '2020-04-04',
        title: 'Some Title',
        tags: [
            'Kitchen',
            'Accessories'
        ]
    },
    {
        category: 'premium',
        date: '2020-04-05',
        title: 'Another Title',
        tags: [
            'Kitchen'
        ]
    },
    ...
]

预期结果:

[
    'Kitchen': [
        {
            category: 'free',
            date: '2020-04-04',
            title: 'Some Title',
            tags: [
                'Kitchen',
                'Accessories'
            ]
        },
        {
            category: 'premium',
            date: '2020-04-05',
            title: 'Another Title',
            tags: [
                'Kitchen'
            ]
        }
    ],
    'Accessories': [
        {
            category: 'free',
            date: '2020-04-04',
            title: 'Some Title',
            tags: [
                'Kitchen',
                'Accessories'
            ]
        }
    ]
]

我试图避免使用库,所以如果您有任何建议,如果您使用 vanilla JS,我将不胜感激。

标签: javascriptarrayssortingfilter

解决方案


将所需的输出视为对象数组,

const data = [
  {
    category: 'free',
    date: '2020-04-04',
    title: 'Some Title',
    tags: ['Kitchen', 'Accessories'],
  },
  {
    category: 'premium',
    date: '2020-04-05',
    title: 'Another Title',
    tags: ['Kitchen'],
  },
];

const filteringTags = ['Kitchen', 'Accessories'];

const getGroupedData = (data, filters) => {
  const result = {};
  filters.forEach(filter => {
    result[filter] = [
      ...JSON.parse(JSON.stringify((result[filter] || ''))),
      ...JSON.parse(JSON.stringify(data.filter(d => d.tags.includes(filter)))),
    ];
  });
  return result;
};

let finalResult = getGroupedData(data, filteringTags);

finalResult = Object.keys(finalResult).map(key => ({
  [key]: finalResult[key],
}));

console.log(finalResult);

将输出视为对象

const data = [
  {
    category: 'free',
    date: '2020-04-04',
    title: 'Some Title',
    tags: ['Kitchen', 'Accessories'],
  },
  {
    category: 'premium',
    date: '2020-04-05',
    title: 'Another Title',
    tags: ['Kitchen'],
  },
];

const filteringTags = ['Kitchen', 'Accessories'];

const getGroupedData = (data, filters) => {
  const result = {};
  filters.forEach(filter => {
    result[filter] = [
      ...JSON.parse(JSON.stringify((result[filter] || ''))),
      ...JSON.parse(JSON.stringify(data.filter(d => d.tags.includes(filter)))),
    ];
  });
  return result;
};

let finalResult = getGroupedData(data, filteringTags);

console.log(finalResult);

希望这可以帮助。


推荐阅读