SPU&SKU

  • 一、SPU简介
  • 二、SKU简介
  • 三、SPU&SKU在项目当中的体现
    • 3.1、后台返回数据结构分析
    • 3.2、如何将单品数据,抽取成商品规格数据
  • 四、矩阵
    • 4.1、矩阵的定义
    • 4.2、矩阵转置
  • 五、代码实现
    • 4.1、遍历的方式
    • 4.2、矩阵转置的方式

一、SPU简介

SPU = Standard Product Unit (标准产品单位)

这样讲可能还是很难理解到底什么是标准产品单位。那么如果以苹果手机为例来说,iPhone 11是一个SPU还是SKU呢?

答案是 SPU 到底什么是SPU呢?我的理解是:SPU是一个标准化的,能相对的包含某些商品显著特征的商品的集合。例如:SPU = 品牌 + 型号 “苹果”+“iPhone 11” 即组成了一个SPU,这里可以称之为“商品”。需要注意的是上面提到的SPU=品牌+型号这个也是相对的意义上的,受场景的和需求的制约。

二、SKU简介

stock keeping unit(库存量单位)

这个的理解,可以在上面的等式上进一步理解为:SKU = SPU + 规格。这里的规格是个统称。比如手机来说,内存,屏幕大小,颜色等是规格;如衣服,颜色,图案,尺码。

三、SPU&SKU在项目当中的体现

3.1、后台返回数据结构分析

下图中sku_list中的specs数组中的是当前spu有的规格项

"spu_detail": {"id":2,"title":"林间有风自营针织衫","subtitle":"秋日冬款,浪漫满屋","category_id":12,"root_category_id":2,"price":"77.00","img":"http://i1.sleeve.7yue.pro/assets/ecf8d824-19d4-4db2-a5da-872ab014fecd.png","for_theme_img":"https://gitee.com/lrelia7/sleeve-static/raw/master/theme/spu1.png","description":null,"discount_price":"62.00","tags":"秋日冬款$浪漫满屋","is_test":true,"online":true,"sku_list":[{"id":2,"price":77.76,"discount_price":null,"online":true,"img":"http://i1.sleeve.7yue.pro/assets/2d22ffec-b1c1-43e0-ad21-25aa5c26ab34.png","title":"金属灰·七龙珠","spu_id":2,"category_id":17,"root_category_id":3,"specs":[{"key_id":1,"key":"颜色","value_id":45,"value":"金属灰"},{"key_id":3,"key":"图案","value_id":9,"value":"七龙珠"},{"key_id":4,"key":"尺码","value_id":14,"value":"小号 S"}],"code":"2$1-45#3-9#4-14","stock":5},{"id":3,"price":66,"discount_price":59,"online":true,"img":"http://i1.sleeve.7yue.pro/assets/c6b52c90-5b10-4823-baef-6c37d3d3532f.png","title":"青芒色·灌篮高手","spu_id":2,"category_id":17,"root_category_id":3,"specs":[{"key_id":1,"key":"颜色","value_id":42,"value":"青芒色"},{"key_id":3,"key":"图案","value_id":10,"value":"灌篮高手"},{"key_id":4,"key":"尺码","value_id":15,"value":"中号 M"}],"code":"2$1-42#3-10#4-15","stock":999},{"id":4,"price":88,"discount_price":null,"online":true,"img":"http://i1.sleeve.7yue.pro/assets/c6b52c90-5b10-4823-baef-6c37d3d3532f.png","title":"青芒色·圣斗士","spu_id":2,"category_id":17,"root_category_id":3,"specs":[{"key_id":1,"key":"颜色","value_id":42,"value":"青芒色"},{"key_id":3,"key":"图案","value_id":11,"value":"圣斗士"},{"key_id":4,"key":"尺码","value_id":16,"value":"大号  L"}],"code":"2$1-42#3-11#4-16","stock":8},{"id":5,"price":77,"discount_price":59,"online":true,"img":"http://i1.sleeve.7yue.pro/assets/09f32ac8-1af4-4424-b221-44b10bd0986e.png","title":"橘黄色·七龙珠","spu_id":2,"category_id":17,"root_category_id":3,"specs":[{"key_id":1,"key":"颜色","value_id":44,"value":"橘黄色"},{"key_id":3,"key":"图案","value_id":9,"value":"七龙珠"},{"key_id":4,"key":"尺码","value_id":14,"value":"小号 S"}],"code":"2$1-44#3-9#4-14","stock":7}],"spu_img_list":[{"id":165,"img":"http://i1.sleeve.7yue.pro/assets/5605cd6c-f869-46db-afe6-755b61a0122a.png","spu_id":2},{"id":166,"img":"http://i1.sleeve.7yue.pro/assets/ecf8d824-19d4-4db2-a5da-872ab014fecd.png","spu_id":2},{"id":167,"img":"http://i1.sleeve.7yue.pro/assets/8451cebd-5a8d-4758-bb2a-652e026a7c00.png","spu_id":2}],"spu_detail_img_list":[{"id":24,"img":"http://i2.sleeve.7yue.pro/n4.png","spu_id":2,"index":1},{"id":27,"img":"http://i2.sleeve.7yue.pro/n7.png","spu_id":2,"index":2},{"id":25,"img":"http://i2.sleeve.7yue.pro/n5.png","spu_id":2,"index":3},{"id":26,"img":"http://i2.sleeve.7yue.pro/n6.png","spu_id":2,"index":4}],"sketch_spec_id":1,"default_sku_id":2
}

将上述的规格提取如下,有四个不同的规格的单品。

SKU名 颜色 图案 尺码
sku1 金属灰 七龙珠 小号 S
sku2 青芒色 灌篮高手 中号 M
sku3 青芒色 圣斗士 大号 L
sku4 橘黄色 七龙珠 小号 S

这里可能会奇怪的点在于,返回的数据格式中并没有返回这个SPU有哪些规格,而是直接返回了有库存的单品的明细。这就意味着需要我们自己去过滤出可以选择的单品的规格

3.2、如何将单品数据,抽取成商品规格数据


如上图所示,我们需要的规格数据是横向排布的。即需要把下图中红色框纵向的规格值,横向排布。

应用到代码中即是使用二维数组的形式:[ [ ] , [ ] , [ ] ]

四、矩阵

4.1、矩阵的定义

4.2、矩阵转置

五、代码实现

4.1、遍历的方式

首先将一个sku的规格数组循环出来,放到数组m中。将数组丢给Matrix对象处理

  _createMatrix(skuList) {const m = []skuList.forEach(sku => {m.push(sku.specs)})return new Matrix(m)}

将m数组丢给matrix类之后,通过内部rowNum(),colNum()方法

Matrix

class Matrix {mconstructor(matrix) {this.m = matrix}// m = [[1,2,3],[4,5,6],[7,8,9]]//  显示如下矩阵// 1,2,3// 4,5,6// 7,8,9/*** 获取行数* @returns {*}*/get rowNum() {return this.m.length}/*** 获取列数* @returns {*}*/get colNum() {return this.m[0].length}each(cb) {for (let j = 0; j < this.colNum; j++) {for (let i = 0; i < this.rowNum; i++) {const element = this.m[i][j]cb(element, i, j)}}}transpose() {const desArr = []for (let j = 0; j<this.colNum; j++) {desArr[j] = []for (let i = 0; i < this.rowNum; i++) {// 矩阵转置就是需要把x,y对调desArr[j][i] = this.m[i][j]}}return desArr}}export {Matrix
}

上图代码中的each方法就在循环遍历m数组,将数组中的元素提取出来,然后调用cb方法返回

 /*** 遍历方式-转置矩阵*/initFence1() {const matrix = this._createMatrix(this.skuList)const fences = []let currentJ = -1matrix.each((element, i, j) => {if (currentJ !== j) {//  列号不同,创建一个新的fencecurrentJ = jfences[currentJ] = this._createFence(element)}//  列号相同则将当前element的信息设置到当前的fence中fences[currentJ].pushValueTitle(element.value)})}_createFence(element) {const fence = new Fence()return fence}

上图代码中需要注意的是,i代表行号,j代表列号,数组在循环取出的过程中,如何判断数组当前列已循环完毕,是由j的值来判断的,如果j的值变化,则说明,当前元素为新的一列的第一个元素了。那么就要新建一个fence来存储这一列的元素。

4.2、矩阵转置的方式

矩阵转置的归结就是把x,y对调。上面Matrix类中的transpose方法中就是把传入的specs数组按照二维数组下标,x轴,y轴转换。这里需要注意的是,transpose方法中的for循环外层必须是y,内层是x。这是因为一列为一个规格。而不是一行为一个规格。

  /*** 矩阵转置-转置矩阵*/initFence() {const matrix = this._createMatrix(this.skuList)const fences = []const AT = matrix.transpose()AT.forEach(specs => {const fence = new Fence(specs)fence.init()fences.push(fence)})}

小程序开发总结-SPUSKU相关推荐

  1. 小程序开发需要注意什么

    小程序对于现在的生活来说已经是一个特别热门的应用了,没有人不知道小程序的存在,小程序有很多的优势,使用特别方便并且不占内存,所以受很多人的喜欢,那么小程序开发需要注意些什么呢?今天方维网络就给大家分享 ...

  2. 微信小程序开发的完整流程介绍,新手必读

    自从跳一跳小程序游戏出现后,一夜之间,小程序就变得家喻户晓了,功能开发也越来越丰富,在微信搜一搜就会发现许多大品牌早已有自己的小程序了,越来越多的企业和商家都看中了这个风口,想快速开发出一款属于自己的 ...

  3. 01 小程序开发入门

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.什么是小程序 小程序是一种不需要下载安装即可使用的应用,它实现了应用"触手可 ...

  4. 微信小程序开发(2)_data属性

    假设我们的环境都做好了,现在我们开始开发自己的小程序 首先我们开发出自己的 Hello World 我们要做的事情是当前点击hello World的时候HelloWorld的颜色发生变化: 这个是我们 ...

  5. 微信小程序开发之选项卡

    选项卡是web开发中经常使用到的一个模块,在小程序中竟然没有,这里参考别人的文章自己做了一个双选项卡 实现思路: 通过绑定swichNav事件来控制currentTab(当前选项卡)和isShow(是 ...

  6. 微信小程序开发优秀教程及文章合集第一期

    2019独角兽企业重金招聘Python工程师标准>>> 我会不定期的选取一些优质教程,整理成辑,以便大家集中阅读: 新手向!微信小程序开发手记系列: 微信小程序开发手记<一&g ...

  7. 经验总结--我的小程序开发和进化之路

    前言 从接触小程序开始,到现在大大小小做了差不多有五六个小程序项目了,小项目的只有几个页面,大的项目有几十个页面.此篇文章是对之前项目的一个总结,项目的脚手架,开发框架和后期的优化是一个逐渐进化完善的 ...

  8. 新闻资讯小程序开发实践

    新闻资讯小程序开发实践 在腾讯小程序上线一周年之际,公司又决定把App产品部分内容在小程序上实现.就在小程序刚上线的时候,公司也有一款产品进行了小程序的研发,但后续没有持续的维护.这过了一年的时间,微 ...

  9. amos看拟合度在哪里看_小程序开发公司哪里强?看这几点

    如今小程序开发已不罕见,越来越多的线下商家需要布局线上渠道,小程序是一个非常好的选择.但是,对于不懂任何技术.也没有自身技术团队的小白而言,若想拥有自己的小程序,就需要找靠谱的微信小程序开发公司,但是 ...

最新文章

  1. java字符串缓冲池分析
  2. _Linux和安卓之间可以传输文件吗?
  3. springMVC 注解 controller层的优化
  4. 乌龟跑步(记忆化搜索)
  5. 信息学奥赛C++语言:行李托运
  6. WannaCry病毒阴魂不散:本田一家工厂受影响停产一天
  7. 解决servlet中get方式中中文乱码问题前驱(一):装饰者模式再理解
  8. Mcafee EPO数据库过大
  9. 8.Nginx 例子
  10. 数据结构PTA期末复习题集
  11. Setup Factory打包winform程序
  12. TAOUP初译稿:提交版本
  13. 【容斥原理】(AtCoder Regular Contest 093 F) Dark Horse
  14. BurpSuite之Intruder模块(暴力破解)
  15. Scratch3.0 二次开发环境部署(一)
  16. php实现展现量cookie,[转载]展现量、点击量、点击率;访客数、访问次数、浏览量的区别与作用...
  17. fillpolygon
  18. KVM-虚拟化技术之Hypervisor-架构
  19. 【超分辨率】(DRN)Closed-loop Matters: Dual Regression Networks for Single Image Super-Resolution
  20. 对学校的希望和寄语_给学校的祝福语

热门文章

  1. xps数据怎么导出为txt_WPF: 读取XPS文件或将word、txt文件转化为XPS文件
  2. 大鸟的QQ快报060608期(转)
  3. 排列熵算法简介及c#实现
  4. 移动网页设计9大原则——第2部分
  5. FreeRTOS任务运行时间信息统计
  6. 大厂人脸识别技术100%失灵!道翰天琼认知智能机器人平台API接口大脑为您揭秘-1。
  7. tomcat日志分析工具awstats配置
  8. win11开机启动显示自动修复。根本原因是最近提供的引导二进制文件已损坏
  9. 技术支持-炫铃声APP
  10. 分享常用的编程工具,让你做到事半功倍