数组对象根据单个key或者多个key进行分组

前端在开发中经常会处理数据,如果是简单的取某个key值的,通常filter、forEach、map、some、every等常用的ES6语法就够了.但是遇到对数组对象进行分类就稍微复杂点了.

请看下面例子.如果只是根据数组的单个key去分组,就很容易,但是根据 ean和sku甚至更多key值相同的分组,就需要巧妙地应用了。

  // 把下列数组按ean进行分组
    const arr = [
            { id: 1, name: "手机1" ,ean: "6901443393268", sku: "51095BKR" },
            { id: 2, name: "手机2", ean: "6901443393262", sku:"51095BBQ" },
            {id: 3, name: "手机3" ,ean: "6901443393262", sku: "51095BKR" },
            { id: 4, name: "手机2", ean: "6901443393262", sku: "51095BKR" },
            {id: 5, name: "手机5", ean: "6901443393268", sku: "51095BBQ" },
            {id: 6, name: "手机3", ean: "6901443393262", sku:"51095BKR" },
            {id: 7, name: "手机7", ean: "6901443393262", sku: "51095BKR" },
            { id: 8, name: "手机5" ,ean: "6901443393268", sku: "51095BBQ" }
        ]

只是根据ean相同分组的话,so easy。代码如下

   function handlerArr(arr, key) {
        const obj = {};
        arr.forEach((item) => {
            const value = item[key];
            obj[value] ? obj[value].push(item) : (obj[value] = [item]);
        });
        return Object.keys(obj).map((item) => obj[item]);
    }

    handlerArr(arr, "ean");

利用每一项的获取的值设置为key,去添加到obj对象里面去,如果有直接push,如果没有直接设置这个key为空数组,同时将这个数组分类。

最终obj对象内的分组如下

然后使用 Object.keys(obj).map((item) => obj[item]) ,关键在于obj[item]取出每一项放入返回的新数组内。

上面只是单个key的,如果根据多个key去分组,如sku和ean进行分组代码可以如下。

     function handlerArr(arr, key) {
        const obj = {};
        arr.forEach((item) => {
            let value = Array.isArray(key) ? key.map((el) => item[el]).join() : item[key];
            obj[value] ? obj[value].push(item) : (obj[value] = [item]);
        });
        return Object.keys(obj).map((item) => obj[item]);
    }
    handlerArr(arr, ["ean", "sku"]);

注意上面是可以传单个key值也可以传多个key值,如果是多个的话,需要以数组的方式传参。下列结果是根据ean和sku相同的进行分组。

注意,后面发现有些大佬的写法如下,单个属性也能达到效果,多个属性的传参也需要做拼接。

    function groupBy(array, f) {
        const groups = {};
        array.forEach(function (o) {
            const group = JSON.stringify(f(o));
            groups[group] = groups[group] || [];
            groups[group].push(o);
        });
        return Object.keys(groups).map(function (group) {
            return groups[group];
        });
    }
    const arrList = groupBy(arr, function (item) {
        return [item.ean];
    });

如果是根据多个属性key值相同分组写法如下,调用时函数传参为  [item.ean+item.sku],如果还有更多得比较key,就需要继续用+号做拼接了。

   function groupBy(array, f) {
        const groups = {};
        array.forEach(function (o) {
            const group = JSON.stringify(f(o));
            groups[group] = groups[group] || [];
            groups[group].push(o);
        });
        return Object.keys(groups).map(function (group) {
            return groups[group];
        });
    }
    const arrList = groupBy(arr, function (item) {
        return [item.ean + item.sku];
    });

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue中,可以使用Vue.extend()方法来复制单个数据生成多个相同的数据。具体的步骤如下: 1. 首先,我们需要定义一个Vue实例或组件,并使用data选项来声明一个单个数据。例如,我们声明了一个名为originalData的单个数据,其值为"Hello, Vue!"。 2. 接下来,我们可以使用Vue.extend()方法来复制单个数据。这个方法接收一个对象作为参数,其中包含我们要复制的数据。我们可以设置复制的个数,也可以设置每个复制品的其他不同的属性。例如,我们可以复制originalData数据5次,并为每一个复制品设置一个不同的id属性。 3. 使用Vue.extend()方法生成的多个数据是独立的,它们具有相同的初始值。我们可以在Vue实例或组件中通过访问这些数据的属性来使用它们。例如,我们可以在模板中使用v-for指令来遍历这些复制的数据,并将它们展示在页面上。 下面是一个示例代码: ```javascript <template> <div> <ul> <li v-for="item in copiedData" :key="item.id">{{ item.content }}</li> </ul> </div> </template> <script> export default { data() { return { originalData: "Hello, Vue!", copiedData: [] }; }, mounted() { const copiedItems = []; for (let i = 0; i < 5; i++) { const copiedItem = Vue.extend({ data() { return { id: i, content: this.originalData }; } }); copiedItems.push(new copiedItem().$mount()); } this.copiedData = copiedItems; } }; </script> ``` 在上述代码中,我们通过Vue.extend()方法复制了5个具有不同id属性的数据对象。然后,我们在mounted生命周期钩子中将这些复制的数据对象添加到了copiedData数组中。 最后,在模板中使用v-for指令遍历copiedData数组,并展示每个复制品的内容。 这样,我们就可以通过复制单个数据来生成多个数据,并在页面上展示它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端 - wei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值