Vue 3 中按照某个字段将数组分成多个数组

方法一:使用 reduce 方法

javascript 复制代码
const originalArray = [
  { id: 1, category: 'A', name: 'Item 1' },
  { id: 2, category: 'B', name: 'Item 2' },
  { id: 3, category: 'A', name: 'Item 3' },
  { id: 4, category: 'C', name: 'Item 4' },
  { id: 5, category: 'B', name: 'Item 5' },
];

const groupedByCategory = originalArray.reduce((acc, item) => {
  const key = item.category;
  if (!acc[key]) {
    acc[key] = [];
  }
  acc[key].push(item);
  return acc;
}, {});

// 结果是一个对象,键是分类,值是该分类下的数组
console.log(groupedByCategory);

方法二:使用 lodash 的 groupBy 方法

如果你项目中使用了 lodash,可以使用它的 groupBy 方法:

javascript 复制代码
import { groupBy } from 'lodash';

const groupedByCategory = groupBy(originalArray, 'category');
console.log(groupedByCategory);

方法三:在 Vue 3 组件中使用计算属性

javascript 复制代码
import { computed } from 'vue';

export default {
  setup() {
    const originalArray = [
      { id: 1, category: 'A', name: 'Item 1' },
      { id: 2, category: 'B', name: 'Item 2' },
      // ...其他数据
    ];

    const groupedByCategory = computed(() => {
      return originalArray.reduce((acc, item) => {
        const key = item.category;
        if (!acc[key]) {
          acc[key] = [];
        }
        acc[key].push(item);
        return acc;
      }, {});
    });

    return {
      groupedByCategory
    };
  }
};

方法四:转换为数组的数组形式

javascript 复制代码
const groupedArray = Object.values(
  originalArray.reduce((acc, item) => {
    const key = item.category;
    if (!acc[key]) {
      acc[key] = [];
    }
    acc[key].push(item);
    return acc;
  }, {})
);

console.log(groupedArray);
// 输出: [
//   [{ id: 1, category: 'A', name: 'Item 1' }, { id: 3, category: 'A', name: 'Item 3' }],
//   [{ id: 2, category: 'B', name: 'Item 2' }, { id: 5, category: 'B', name: 'Item 5' }],
//   [{ id: 4, category: 'C', name: 'Item 4' }]
// ]

在模板中使用

html 复制代码
<template>
  <div v-for="(group, category) in groupedByCategory" :key="category">
    <h3>Category: {{ category }}</h3>
    <ul>
      <li v-for="item in group" :key="item.id">
        {{ item.name }}
      </li>
    </ul>
  </div>
</template>
相关推荐
AlienZHOU4 小时前
DeepSeek Harness 插件:HTML 实时可视化编辑
前端·agent·deepseek
剪刀石头布啊7 小时前
javascript手动实现继承
前端
Elias不吃糖7 小时前
Langfuse 入门:Trace、Prompt、Dataset、Experiment、Evaluator
前端·python·prompt·langfuse
vipbic7 小时前
一个前端的 9 天重构:我是怎么用 Codex 重做航栈的
前端·javascript·后端
资源大佬星 课it8 小时前
重学C++ ,重构你的C++知识体系
vue.js·docker·django
Eason_Lou9 小时前
【无标题】
前端·vue.js·html
_codemonster9 小时前
npm run dev 是在开发模式运行,怎么在生产环境运行
前端·npm·node.js
kyriewen10 小时前
我受够了复制报错去问 AI,花一下午给控制台做了个调试助手
前端·javascript·ai编程
IT_陈寒11 小时前
Redis的DEL命令竟然没删掉数据?我踩的这个坑你得知道
前端·人工智能·后端