商品规格项数据的遍历以及添加

news/2024/7/10 3:01:52 标签: vue

简介

今天在处理规格项的数据时遇到了一些问题,接下来就给大家分享一下

 

规格项数据设计

 "specifications": [
            {
                "goodsSpecificationId": 6,
                "goodsSpecificationName": "网络类型",
                "goodsTypeId": 24,
                "goodsSpecificationOptions": [
                    {
                        "goodsSpecificationOptionId": 12,
                        "goodsSpecificationOptionName": "5G全网通",
                        "goodsSpecificationId": 6
                    },
                    {
                        "goodsSpecificationOptionId": 28,
                        "goodsSpecificationOptionName": "4G全网通",
                        "goodsSpecificationId": 6
                    }
                ]
            },
            {
                "goodsSpecificationId": 7,
                "goodsSpecificationName": "机身颜色",
                "goodsTypeId": 24,
                "goodsSpecificationOptions": [
                    {
                        "goodsSpecificationOptionId": 13,
                        "goodsSpecificationOptionName": "粉色",
                        "goodsSpecificationId": 7
                    },
                    {
                        "goodsSpecificationOptionId": 14,
                        "goodsSpecificationOptionName": "白色",
                        "goodsSpecificationId": 7
                    },
                    {
                        "goodsSpecificationOptionId": 15,
                        "goodsSpecificationOptionName": "黑色",
                        "goodsSpecificationId": 7
                    },
                    {
                        "goodsSpecificationOptionId": 16,
                        "goodsSpecificationOptionName": "蓝色",
                        "goodsSpecificationId": 7
                    },
                    {
                        "goodsSpecificationOptionId": 17,
                        "goodsSpecificationOptionName": "金色",
                        "goodsSpecificationId": 7
                    },
                    {
                        "goodsSpecificationOptionId": 29,
                        "goodsSpecificationOptionName": "夏日胡杨",
                        "goodsSpecificationId": 7
                    }
                ]
            },
            {
                "goodsSpecificationId": 8,
                "goodsSpecificationName": "屏幕尺寸",
                "goodsTypeId": 24,
                "goodsSpecificationOptions": [
                    {
                        "goodsSpecificationOptionId": 18,
                        "goodsSpecificationOptionName": "6.1寸",
                        "goodsSpecificationId": 8
                    },
                    {
                        "goodsSpecificationOptionId": 19,
                        "goodsSpecificationOptionName": "6.7寸",
                        "goodsSpecificationId": 8
                    }
                ]
            },
            {
                "goodsSpecificationId": 9,
                "goodsSpecificationName": "存储容量",
                "goodsTypeId": 24,
                "goodsSpecificationOptions": [
                    {
                        "goodsSpecificationOptionId": 20,
                        "goodsSpecificationOptionName": "128G",
                        "goodsSpecificationId": 9
                    },
                    {
                        "goodsSpecificationOptionId": 21,
                        "goodsSpecificationOptionName": "256G",
                        "goodsSpecificationId": 9
                    },
                    {
                        "goodsSpecificationOptionId": 22,
                        "goodsSpecificationOptionName": "512G",
                        "goodsSpecificationId": 9
                    }
                ]
            },
            {
                "goodsSpecificationId": 10,
                "goodsSpecificationName": "套餐类型",
                "goodsTypeId": 24,
                "goodsSpecificationOptions": [
                    {
                        "goodsSpecificationOptionId": 23,
                        "goodsSpecificationOptionName": "官方标配",
                        "goodsSpecificationId": 10
                    },
                    {
                        "goodsSpecificationOptionId": 24,
                        "goodsSpecificationOptionName": "套餐一",
                        "goodsSpecificationId": 10
                    },
                    {
                        "goodsSpecificationOptionId": 25,
                        "goodsSpecificationOptionName": "套餐二",
                        "goodsSpecificationId": 10
                    },
                    {
                        "goodsSpecificationOptionId": 26,
                        "goodsSpecificationOptionName": "套餐三",
                        "goodsSpecificationId": 10
                    }
                ]
            },
            {
                "goodsSpecificationId": 12,
                "goodsSpecificationName": "运行内存",
                "goodsTypeId": 24,
                "goodsSpecificationOptions": [
                    {
                        "goodsSpecificationOptionId": 30,
                        "goodsSpecificationOptionName": "4G",
                        "goodsSpecificationId": 12
                    },
                    {
                        "goodsSpecificationOptionId": 32,
                        "goodsSpecificationOptionName": "8G",
                        "goodsSpecificationId": 12
                    },
                    {
                        "goodsSpecificationOptionId": 33,
                        "goodsSpecificationOptionName": "12G",
                        "goodsSpecificationId": 12
                    }
                ]
            }
        ]
    }

问题的出现

由于是使用一个遍历,将所有规格的数据遍历后在进行一个选中事件的处理,那么最难的部分当属于这个事件处理这块了,如何去辨别此数据是否是已选数据,同一个规格的数据等等以及如何去处理这些数据

下面是视图层的遍历

<div class="goodsDesc_select">
              <div v-for="item in goodsDesc.specifications" :key="item" class="goodsDesc_select_box">
                <div class="goodsDesc_select_name">{{ item.goodsSpecificationName }}&nbsp;:</div>
                <div>
                  <ul style="display: flex;flex-wrap: wrap">
                    <el-button
                        v-for="type in item.goodsSpecificationOptions" :key="type.goodsSpecificationOptionId"
                        :class="{ actived_select: type.selected}"
                        @click="changeSelectedStatus(item,type)"
                    >{{ type.goodsSpecificationOptionName }}
                    </el-button>
                  </ul>
                </div>
              </div>
            </div>

解决逻辑

算法不太好,所写的有点无脑

/**
 * 规格选择事件
 */
const changeSelectedStatus = (item, typeProxy) => {
  //判断并设置高亮
  if (typeProxy.selected) {
    typeProxy.selected = false
  } else {
    item.goodsSpecificationOptions.forEach(typeProxy => typeProxy.selected = false)
    typeProxy.selected = true
  }
  //把Proxy数据转换为js数据
  const type = JSON.parse(JSON.stringify(typeProxy))
  //添加所选的规格数据
  if (specificationOptions.length == 0) {
    specificationOptions.push(type)
  } else {
    specificationOptions.forEach((e) => {
      //如果父id相同则更改名字
      if (e.goodsSpecificationId == type.goodsSpecificationId) {
        e.goodsSpecificationOptionName = type.goodsSpecificationOptionName
      } else {
        //否则添加,这里会引发重复添加问题
        specificationOptions.push(type)
      }
    })
  }
  //去重复后的数组
  const uniqueArray = specificationOptions.reduce((accumulator, currentValue) => {
    if (!accumulator.includes(currentValue)) {
      accumulator.push(currentValue);
    }
    return accumulator;
  }, []);
  //清空specificationOptions
  specificationOptions.splice(0, specificationOptions.length)
  //复制数组
  for (let i = 0; i < uniqueArray.length; i++) {
    specificationOptions.push(uniqueArray[i])
  }
  console.log(specificationOptions)
}


http://www.niftyadmin.cn/n/5113180.html

相关文章

远程监控高并发高吞吐java进程

文章目录 背景工具jconsole和jvisualvm 压测实战以太坊Java程序监控1.使用jconsole监控2.使用jvisualvm监控 问题分析堆内存使用异常通过调整内存策略来应对&#xff1a; 交易虚增问题 背景 作为使用java技术栈的金融类公司&#xff0c;确保Java程序在生产环境中的稳定性和性能…

python学习笔记:引用、浅拷贝和深拷贝(底层原理)

前言 在python中“一切皆对象”&#xff0c;包括整数&#xff08;int&#xff09;&#xff0c;小数&#xff08;float&#xff09;等 引用 Python解释器维护了一个内部的数据结构&#xff0c;称为命名空间或符号表&#xff0c;它将变量名与对象的内存地址关联起来。当您创建一…

[Emeuelc]DC模拟器Flycast按键设置相关研究

独立模拟器配置文件相关路径为 手柄特殊配置文件为&#xff0c;即emuelec自动配置手柄后&#xff0c;你仍然在独立模拟器里&#xff0c;手动修改了按键映射后产生的特殊配置文件 /storage/.config/flycast/mappings/手柄名称.cfg 模拟器设置文件为&#xff1a; /storage/.c…

【GESP】2023年06月图形化三级 -- 计算最终值

文章目录 计算最终值【题目描述】【输入描述】【输出描述】【参考答案】其他测试用例 计算最终值 【题目描述】 默认小猫角色&#xff0c;白色背景。存在一种仅支持2种操作和1个变量的编程语言&#xff1a; X 使变量 “X” 的值增加1X-- 使变量 “X” 的值减少 1 最初&#…

C. You Are So Beautiful Codeforces Round 905 (Div. 2)

Problem - C - Codeforces 题目大意&#xff1a;有一个长度为n的数组a&#xff0c;问有多少个子串[l,r]&#xff0c;满足这个子串作为子序列只在a中出现过一次 1<n<1e5;1<a[i]<1e9 思路&#xff1a;我们发现对于从1开始的连续区间&#xff0c;答案都是非递减的&…

3.1.1手写线程池与性能分析

1.线程池是是什么&#xff0c;组成结构&#xff0c;为什么 2.线程池实现 核心代码 3.线程池在开源框架中的应用 线程池是管理维持固定数量的池式结构 为什么是固定数量&#xff1f; 如何决定数量&#xff1f; 区分任务 1.cpu密集型 核心数个 2.io密集型&#xff08;网络io&am…

KEGG通路图绘制 | ggpathway包

「一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01;」 写在前面 今天在GitHub中看到一个ggpathway的包&#xff0c;主要可以制作通路网络图&#xff0c;或是进一步优化的话&#xff0c;可以进行个性话制作。 操作步骤在GitHub中已经很详细。自己也照葫芦画瓢进行…

xxl-job学习

学习链接 xxl-job官方文档 【分布式任务调度】三、XXL-JOB详细介绍 xxljob从入门到精通-全网段最全解说 XXL-JOB分布式任务调度框架(一)-基础入门 XXL-JOB分布式任务调度框架(二)-策略详解 XXL-JOB分布式任务调度框架(三)-集群部署 XXL-JOB分布式任务调度框架(四)-源码分析…