当前位置: 首页 > news >正文

vue前端sku实现

this.value.skuStockList = [];let skuList = this.value.skuStockList;//只有一个属性时if (this.selectProductAttr.length === 1) {let attr = this.selectProductAttr[0];for (let i = 0; i < attr.values.length; i++) {skuList.push({spData: JSON.stringify([{key:attr.name,value:attr.values[i]}])});}} else if (this.selectProductAttr.length === 2) {let attr0 = this.selectProductAttr[0];let attr1 = this.selectProductAttr[1];for (let i = 0; i < attr0.values.length; i++) {if (attr1.values.length === 0) {skuList.push({spData: JSON.stringify([{key:attr0.name,value:attr0.values[i]}])});continue;}for (let j = 0; j < attr1.values.length; j++) {let spData = [];spData.push({key:attr0.name,value:attr0.values[i]});spData.push({key:attr1.name,value:attr1.values[j]});skuList.push({spData: JSON.stringify(spData)});}}} else {let attr0 = this.selectProductAttr[0];let attr1 = this.selectProductAttr[1];let attr2 = this.selectProductAttr[2];for (let i = 0; i < attr0.values.length; i++) {if (attr1.values.length === 0) {skuList.push({spData: JSON.stringify([{key:attr0.name,value:attr0.values[i]}])});continue;}for (let j = 0; j < attr1.values.length; j++) {if (attr2.values.length === 0) {let spData = [];spData.push({key:attr0.name,value:attr0.values[i]});spData.push({key:attr1.name,value:attr1.values[j]});skuList.push({spData: JSON.stringify(spData)});continue;}for (let k = 0; k < attr2.values.length; k++) {let spData = [];spData.push({key:attr0.name,value:attr0.values[i]});spData.push({key:attr1.name,value:attr1.values[j]});spData.push({key:attr2.name,value:attr2.values[k]});skuList.push({spData: JSON.stringify(spData)});}}}}

假设的选择属性数据

假设选择的商品属性如下(可以根据需要调整):
 

this.selectProductAttr = [{ name: "颜色", values: ["红色", "蓝色"] },{ name: "大小", values: ["S", "M"] },{ name: "材质", values: ["棉", "羊毛"] }
];

初始化部分

首先,代码初始化了一个空数组 skuStockList,并通过 skuList 引用指向该数组。

this.value.skuStockList = [];
let skuList = this.value.skuStockList;

这段代码的目的是为后续生成的 SKU 列表提供一个存储地方。

处理不同数量的属性

接下来,代码根据 this.selectProductAttr.length 的值判断当前有多少个属性被选择。根据属性的数量,代码将生成不同数量的组合 SKU。

1. 只有一个属性时

if (this.selectProductAttr.length === 1) {let attr = this.selectProductAttr[0]; // 获取第一个属性for (let i = 0; i < attr.values.length; i++) { // 遍历该属性的所有值skuList.push({spData: JSON.stringify([{ key: attr.name, value: attr.values[i] }])});}
}

执行过程:

  • 只有一个属性 "颜色",其值为 ["红色", "蓝色"]
  • 对这个属性的每一个值,生成一个 SKU 并推入 skuList

结果:

[{"spData": "[{\"key\":\"颜色\",\"value\":\"红色\"}]"},{"spData": "[{\"key\":\"颜色\",\"value\":\"蓝色\"}]"}
]

2. 有两个属性时

else if (this.selectProductAttr.length === 2) {let attr0 = this.selectProductAttr[0]; // 获取第一个属性let attr1 = this.selectProductAttr[1]; // 获取第二个属性for (let i = 0; i < attr0.values.length; i++) { // 遍历第一个属性的所有值if (attr1.values.length === 0) { // 如果第二个属性没有值skuList.push({spData: JSON.stringify([{ key: attr0.name, value: attr0.values[i] }])});continue; // 跳过当前循环,继续处理下一个第一个属性的值}for (let j = 0; j < attr1.values.length; j++) { // 遍历第二个属性的所有值let spData = [];spData.push({ key: attr0.name, value: attr0.values[i] }); // 添加第一个属性的值spData.push({ key: attr1.name, value: attr1.values[j] }); // 添加第二个属性的值skuList.push({spData: JSON.stringify(spData)});}}
}

执行过程:

  • 有两个属性 "颜色" 和 "大小",其中 "颜色" 有 ["红色", "蓝色"]"大小" 有 ["S", "M"]
  • 代码会生成两个属性的所有组合。即,遍历 "颜色" 的每一个值,并与 "大小" 的每个值进行配对。

结果:

[{"spData": "[{\"key\":\"颜色\",\"value\":\"红色\"},{\"key\":\"大小\",\"value\":\"S\"}]"},{"spData": "[{\"key\":\"颜色\",\"value\":\"红色\"},{\"key\":\"大小\",\"value\":\"M\"}]"},{"spData": "[{\"key\":\"颜色\",\"value\":\"蓝色\"},{\"key\":\"大小\",\"value\":\"S\"}]"},{"spData": "[{\"key\":\"颜色\",\"value\":\"蓝色\"},{\"key\":\"大小\",\"value\":\"M\"}]"}
]

3. 有三个属性时

else {let attr0 = this.selectProductAttr[0]; // 获取第一个属性let attr1 = this.selectProductAttr[1]; // 获取第二个属性let attr2 = this.selectProductAttr[2]; // 获取第三个属性for (let i = 0; i < attr0.values.length; i++) { // 遍历第一个属性的所有值if (attr1.values.length === 0) { // 如果第二个属性没有值skuList.push({spData: JSON.stringify([{ key: attr0.name, value: attr0.values[i] }])});continue; // 跳过当前循环,继续处理下一个第一个属性的值}for (let j = 0; j < attr1.values.length; j++) { // 遍历第二个属性的所有值if (attr2.values.length === 0) { // 如果第三个属性没有值let spData = [];spData.push({ key: attr0.name, value: attr0.values[i] }); // 添加第一个属性的值spData.push({ key: attr1.name, value: attr1.values[j] }); // 添加第二个属性的值skuList.push({spData: JSON.stringify(spData)});continue; // 跳过当前循环,继续处理下一个第二个属性的值}for (let k = 0; k < attr2.values.length; k++) { // 遍历第三个属性的所有值let spData = [];spData.push({ key: attr0.name, value: attr0.values[i] }); // 添加第一个属性的值spData.push({ key: attr1.name, value: attr1.values[j] }); // 添加第二个属性的值spData.push({ key: attr2.name, value: attr2.values[k] }); // 添加第三个属性的值skuList.push({spData: JSON.stringify(spData)});}}}
}

执行过程:

  • 有三个属性 "颜色""大小" 和 "材质",其值分别为:
    • "颜色"["红色", "蓝色"]
    • "大小"["S", "M"]
    • "材质"["棉", "羊毛"]
  • 代码会生成三个属性的所有组合。即,遍历 "颜色" 的每一个值,和 "大小""材质" 的每个值进行配对。

结果:

[{"spData": "[{\"key\":\"颜色\",\"value\":\"红色\"},{\"key\":\"大小\",\"value\":\"S\"},{\"key\":\"材质\",\"value\":\"棉\"}]"},{"spData": "[{\"key\":\"颜色\",\"value\":\"红色\"},{\"key\":\"大小\",\"value\":\"S\"},{\"key\":\"材质\",\"value\":\"羊毛\"}]"},{"spData": "[{\"key\":\"颜色\",\"value\":\"红色\"},{\"key\":\"大小\",\"value\":\"M\"},{\"key\":\"材质\",\"value\":\"棉\"}]"},{"spData": "[{\"key\":\"颜色\",\"value\":\"红色\"},{\"key\":\"大小\",\"value\":\"M\"},{\"key\":\"材质\",\"value\":\"羊毛\"}]"},{"spData": "[{\"key\":\"颜色\",\"value\":\"蓝色\"},{\"key\":\"大小\",\"value\":\"S\"},{\"key\":\"材质\",\"value\":\"棉\"}]"},{"spData": "[{\"key\":\"颜色\",\"value\":\"蓝色\"},{\"key\":\"大小\",\"value\":\"S\"},{\"key\":\"材质\",\"value\":\"羊毛\"}]"},{"spData": "[{\"key\":\"颜色\",\"value\":\"蓝色\"},{\"key\":\"大小\",\"value\":\"M\"},{\"key\":\"材质\",\"value\":\"棉\"}]"},{"spData": "[{\"key\":\"颜色\",\"value\":\"蓝色\"},{\"key\":\"大小\",\"value\":\"M\"},{\"key\":\"材质\",\"value\":\"羊毛\"}]"}
]

总结

  • 代码根据选择的商品属性数量动态生成不同数量的 SKU 组合。
  • 当属性数量为 1 时,生成一个包含该属性所有值的 SKU 列表。
  • 当属性数量为 2 时,生成包含这两个属性所有值的组合 SKU 列表。
  • 当属性数量为 3 时,生成包含三个属性的所有组合 SKU 列表。
  • 每一个 SKU 都是一个包含属性名和值的 JSON 字符串,保存在 skuStockList 中。

通过这些步骤,代码可以灵活地处理多属性商品的不同组合,最终生成不同的 SKU 列表。

相关文章:

vue前端sku实现

this.value.skuStockList [];let skuList this.value.skuStockList;//只有一个属性时if (this.selectProductAttr.length 1) {let attr this.selectProductAttr[0];for (let i 0; i < attr.values.length; i) {skuList.push({spData: JSON.stringify([{key:attr.name,v…...

使用Vue3和Vue2进行开发的区别

使用Vue3和Vue2进行开发的区别 笔者虽然老早就是用vue3进行开发了&#xff0c;但是上次有人问道使用vue3进行开发跟使用vue2进行开发的区别有哪些这个问题的时候&#xff0c;回答的还是有些琐碎&#xff0c;干脆今天专门整理一下&#xff0c;做个记录。 一、再也不用set了 众所…...

爬虫入门urllib 和 request(二)

文章目录 1、urllib介绍2、urllib的基本方法介绍2.1 urllib.Request2.2 response.read() 3、urllib请求百度首页的完整例子4、小结 1、urllib介绍 除了requests模块可以发送请求之外, urllib模块也可以实现请求的发送,只是操作方法略有不同! urllib在python中分为urllib和url…...

【大数据学习 | HBASE】hbase的整体架构

hbase的region存储原理图 首先我们看到hbase的组成分为两个大的部分&#xff0c;分别是hmaster和hregionserver&#xff0c;主节点用于协调数据&#xff0c;regionserver用于真正的去管理表&#xff0c;其中regionserver存在多个&#xff0c;他们共同协调管理全有的表&#xff…...

群控系统服务端开发模式-应用开发-个人资料

群控系统服务端开发模式后端基础框架现在就差个人资料、及权限验证。下面开发个人资料。 一、获取个人信息 1、添加路由 在根目录下route文件夹下面app.php文件中添加如下代码&#xff1a; Route::post(member/personal_data,permission.Member/personalData);// 获取个人信息…...

openssl生成加密,公钥实现非对称加密

私钥用于加密&#xff0c;公钥用于解密 私钥用于颁发token&#xff0c;公钥用于验证token&#xff0c;公钥不能颁发token 私钥和公钥是一对&#xff0c;不能单独使用&#xff0c;利用私钥生成公钥&#xff0c;利用公钥进行解密 使用openssl来生成一对私钥和公钥&#xff1a;ope…...

[CKS] K8S Admission Set Up

最近准备花一周的时间准备CKS考试&#xff0c;在准备考试中发现有一个题目关于Admission。 Whats Admission Kubernetes Admission是Kubernetes集群中一种机制&#xff0c;用于控制和修改集群中的资源对象。它允许您在Kubernetes资源被创建、更新或删除之前&#xff0c;对资源…...

前端学习Day13 CSS盒子的定位(固定定位篇“附练习”)

一、固定定位 固定定位 &#xff08;position:fixed&#xff09;其实是绝对定位的子类别&#xff0c;一个设置了 position:fixed 的元素是相对于视窗固定的&#xff0c;就算页面文档发生了滚动&#xff0c;它也会一直待在相同的地方。 ⚠️&#xff1a;固定定位会脱离文档流。…...

Tomcat 启动卡住,日志显示 At least one JAR was scanned for TLDs yet contained no TLDs.

现象 Tomcat 启动后&#xff0c;控制台输出卡在了&#xff1a; At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JA…...

计算机网络:网络层 —— 移动 IP 技术

文章目录 IPv6IPv6 的诞生背景主要优势IPv6引进的主要变化 IPv6数据报的基本首部IPv6数据报首部与IPv4数据报首部的对比 IPv6数据报的拓展首部IPv6地址IPv6地址空间大小IPv6地址的表示方法 IPv6地址的分类从IPv4向IPv6过渡使用双协议栈使用隧道技术 网际控制报文协议 ICMPv6ICM…...

useCrudSchemas

摘要&#xff1a; useCrudSchemas 不是一个标准的JavaScript或数据库操作库函数&#xff0c;也不是一个广泛认知的术语。它可能是某个特定项目或应用程序中定义的一个自定义函数或方法&#xff0c;用于简化CRUD&#xff08;创建、读取、更新、删除&#xff09;操作。 在Web开发…...

SpringBoot3集成Junit5

目录 1. 确保项目中包含相关依赖2. 配置JUnit 53. 编写测试类4、Junit5 新增特性4.1 注解4.2 断言4.3 嵌套测试4.4 总结 在Spring Boot 3中集成JUnit 5的步骤相对简单。以下是你可以按照的步骤&#xff1a; 1. 确保项目中包含相关依赖 首先&#xff0c;确保你的pom.xml文件中…...

【EMNLP2024】阿里云人工智能平台 PAI 多篇论文入选 EMNLP2024

近期&#xff0c;阿里云人工智能平台 PAI 的多篇论文在 EMNLP2024 上入选。论文成果是阿里云与华南理工大学金连文教授团队、复旦大学王鹏教授团队共同研发。EMNLP 是人工智能自然语言处理领域的顶级国际会议&#xff0c;聚焦于自然语言处理技术在各个应用场景的学术研究&#…...

Spark的Shuffle过程

一、Shuffle 的作用是什么&#xff1f; Shuffle 操作可以理解为将集群中各个节点上的数据进行重新整理和分类的过程。这一概念源自 Hadoop 的 MapReduce 模型&#xff0c;Shuffle 是连接 Map 阶段和 Reduce 阶段的关键环节。在分布式计算中&#xff0c;每个计算节点通常只处理任…...

Java+Swing可视化图像处理软件

JavaSwing可视化图像处理软件 一、系统介绍二、功能展示1.图片裁剪2.图片缩放3.图片旋转4.图像灰度处理5.图像变形6.图像扭曲7.图像移动 三、系统实现1.ImageProcessing.java 四、其它1.其他系统实现2.获取源码 一、系统介绍 该系统实现了图片裁剪、缩放、旋转、图像灰度处理、…...

RDD转换算子:【mapValues、mapPartitions】

文章目录 1、mapValues算子功能语法举例 2、mapPartitions算子功能语法举例 1、mapValues算子 功能 针对二元组KV类型的RDD&#xff0c;对RDD中每个元素的Value进行map处理&#xff0c;结果放入一个新的RDD中 语法 def mapValues(self: RDD[Tuple[K,V]], f: (V) -> U) -…...

数组和指针的复杂关系

C语言中指针和数组的关系似乎很“纠结”&#xff0c;让人爱恨交织。本文试图帮助读者理清它们之间的复杂关系&#xff01; 数组名的理解 数组元素在内存中是连续存放的&#xff0c;在C语言中&#xff0c;数组名有特殊的含义&#xff0c;它表示数组首元素的地址。因此&#xf…...

Linux系统I/O调优实例

文章目录 一 、资源限制二、测试硬盘速度&#xff1a; 一 、资源限制 限制用户资源配置文件&#xff1a;/etc/security/limits.conf [rootxuegod63 ~]# vim /etc/security/limits.conf 每行的格式&#xff1a; 用户名/用户组名 类型(软限制/硬限制) 选项 值 通常我们在服务器…...

记录Ubuntu OS的异常

PS: 参加过408改卷的ZJU ghsongzju.edu.cn 开启嘲讽: 你们知道408有多简单吗&#xff0c;操作系统真实水平自己知道就行&#xff5e;&#xff5e; dmesg dmesg 是一个用于显示内核环形缓冲区消息的命令&#xff0c;主要用于查看系统启动时的消息、驱动程序加载信息、硬件错误…...

Vue 3 单元测试与E2E测试

在Vue 3应用的开发过程中&#xff0c;测试是一个至关重要的环节。它不仅能够确保代码的正确性&#xff0c;还能在后续的代码重构和升级过程中提供安全保障。本文将深入探讨Vue 3的单元测试&#xff08;Unit Testing&#xff09;和端到端测试&#xff08;End-to-End Testing, E2…...

供应链需求预测系统:Granite TimeSeries FlowState R1助力库存优化

供应链需求预测系统&#xff1a;Granite TimeSeries FlowState R1助力库存优化 每次大促过后&#xff0c;仓库里总是一片狼藉。畅销品早早断货&#xff0c;客服电话被打爆&#xff1b;而另一堆商品却纹丝不动&#xff0c;占满了宝贵的库位&#xff0c;资金就这么被“冻”在了货…...

如何高效解析和生成PSD文件:Ag-PSD库完整指南

如何高效解析和生成PSD文件&#xff1a;Ag-PSD库完整指南 【免费下载链接】ag-psd Javascript library for reading and writing PSD files 项目地址: https://gitcode.com/gh_mirrors/ag/ag-psd 在当今数字设计工作流中&#xff0c;Photoshop文档&#xff08;PSD&#…...

嵌入式WiFi开发 | 基于wireless_tools的交叉编译实战与移植指南

1. 嵌入式WiFi开发入门&#xff1a;为什么需要wireless_tools&#xff1f; 在嵌入式Linux开发中&#xff0c;网络连接能力往往是刚需。想象一下你的智能家居设备需要自动连接路由器&#xff0c;或者工业传感器需要通过WiFi上传数据——这些都离不开可靠的无线网络配置工具。这就…...

5个痛点解决:ComfyUI-KJNodes让工作流效率提升60%的实战指南

5个痛点解决&#xff1a;ComfyUI-KJNodes让工作流效率提升60%的实战指南 【免费下载链接】ComfyUI-KJNodes Various custom nodes for ComfyUI 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-KJNodes ComfyUI-KJNodes是一套功能强大的ComfyUI自定义节点集合&…...

推荐系统优化秘籍:如何用Metric Learning解决冷启动问题?

推荐系统优化秘籍&#xff1a;如何用Metric Learning解决冷启动问题&#xff1f; 在推荐系统领域&#xff0c;冷启动问题一直是困扰算法工程师和产品经理的核心挑战之一。新用户缺乏历史行为数据&#xff0c;新商品没有足够的曝光记录&#xff0c;传统协同过滤方法在这些场景下…...

OTA电路仿真实战:用Virtuoso617分析频率响应与相位特性

OTA电路仿真实战&#xff1a;用Virtuoso617分析频率响应与相位特性 在模拟电路设计领域&#xff0c;运算跨导放大器&#xff08;OTA&#xff09;作为核心构建模块&#xff0c;其性能直接决定了整个系统的表现。本文将带您深入Virtuoso617的仿真世界&#xff0c;通过实战案例解…...

RWKV7-1.5B-g1a作品分享:多轮追问下保持主题聚焦的能力验证

RWKV7-1.5B-g1a作品分享&#xff1a;多轮追问下保持主题聚焦的能力验证 1. 模型简介与测试背景 rwkv7-1.5B-g1a是基于RWKV-7架构的多语言文本生成模型&#xff0c;特别适合基础问答、文案续写、简短总结和轻量中文对话场景。本次测试将重点验证该模型在多轮对话中保持主题聚焦…...

从DTC诊断码到ECU恢复:深入解析车载CAN总线的BUSOFF快慢恢复机制

从DTC诊断码到ECU恢复&#xff1a;车载CAN总线BUSOFF快慢恢复机制实战指南 当CAN总线上的某个ECU因连续发送失败而触发BUSOFF状态时&#xff0c;整个车载网络的稳定性便面临严峻考验。作为汽车电子诊断工程师&#xff0c;我们常常需要在深夜的生产线上&#xff0c;面对闪烁的故…...

3大突破性功能:Koodo Reader重塑你的跨平台数字阅读体验

3大突破性功能&#xff1a;Koodo Reader重塑你的跨平台数字阅读体验 【免费下载链接】koodo-reader A modern ebook manager and reader with sync and backup capacities for Windows, macOS, Linux and Web 项目地址: https://gitcode.com/GitHub_Trending/koo/koodo-reade…...

OpenClaw+百川2-13B自动化数据分析:Excel报告生成与可视化

OpenClaw百川2-13B自动化数据分析&#xff1a;Excel报告生成与可视化 1. 为什么需要自动化数据分析工具 上周我接手了一个市场调研项目&#xff0c;需要分析来自5个渠道的销售数据。当我第三次因为手工复制粘贴数据出错而不得不重做报表时&#xff0c;突然意识到&#xff1a;…...