ios SKU 组合算法
通俗来讲,一个SKU 就是商品在规格上的一种组合,比如说,一件衣服 有红色 M号的 也有蓝色 L号的 ,不同的组合就是不同的SKU
近段时间,刚好遇到要在商品详情页购买商品的时候,实现选择不同规格组合的sku,预判无库存sku选项置灰,减少客户不必要sku的选择。
网上搜寻了一大批有关sku选择算法的文章,然后被各路大神的一顿操作秀得一脸懵逼,简单来说就是没看懂。。。
当然基于以上参考得到的灵感,终于总结出来了一种简单易用通俗易懂的sku选择算法,思路简单,唯一的bug是sku数据有n多层的时候,计算量大耗内存。当然现在手机的运算能力都是杠杠的,正常来说商品的sku也不会有几十上百层那么夸张。
接下来我先捋一下思路吧!
Tips: sku 有三种状态,可选(正常),不可选(置灰),已选中(高亮),
一,sku算法初版:计算所有sku的组合 与 有库存sku的组合的交集,交集里面的sku为可选项,反之其他sku为不可选。
1.计算所有sku的组合-->集合A
A = ["34,61,66" , "34,61,67" , ......]
2.计算有库存的sku的组合 -->集合B
一般是从后台服务器返回的 eg:
3. 计算集合A与集合B的交集,交集里面的所有元素就是初始时所有可选sku ID ,反之其他sku ID就是置灰(无库存不可选状态)
4.以上三步就是简易的sku算法核心思路,弹出规格框时,计算集合A和集合B的交集,得到初步赛选结果,告诉客户,哪些sku无库存不可选置灰显示,可选的为正常状态显示,减少客户做不必要的选择操作。
5.当然,细心的你很快就会发现这样的sku算法会导致无法判断出,已选sku的兄弟节点是否可选的bug。
二,优化兄弟节点的可选状态判断bug
1.如上图 已选Platform 属性的 34,长度属性的 62 , 我们要判断的已选sku兄弟节点属性分别是Platform 属性的 35,长度属性的 61。
2.即:
要判断 长度属性的 61是否为可选,就要判断,34,61这样的组合是否属于有库存组合里面子集,是:可选,不是: 不可选。
同理:
要判断 Platform 属性的 35是否为可选,就要判断,35,62这样的组合是否属于有库存组合里面子集,是:可选,不是: 不可选。
3.细心的你肯定发现了规律,34,61 或者 35,62 这样的组合都有一个共同点
即:包含n个已选skuID,n = 已选sku个数-1 .
三,计算兄弟节点是否可选
1,计算已选sku ID 同类属性的组合 ==集合C 即:计算Platform 属性和长度属性的组合
集合C = ["34,61","34,62","35,61","35,61","35,62"]
2.计算已选skuID的子集 ==集合D 即:计算 [34,62]的子集
集合D = ["34","62","34,62"]
3.从集合D里面筛选出,含有n个已选skuID的子集(n = 已选sku个数-1 )==集合E
集合E = ["34","62"]
4.最后计算可选兄弟节点组合,集合C里面的组合只要是含有集合E里面的元素都是可选兄弟节点组合
可选兄弟节点组合F = 【集合C里面的组合只要是含有集合E里面的元素】
5.
兄弟节点可选skuID = 【(集合A与集合B的交集的skuID集合)再与 集合F 的并集 】
四,整理
1.筛选有库存的sku组合为可选sku 其余为不可选sku
2.计算兄弟节点可选sku
3.可选sku正常显示,不可选sku置灰,已选sku高亮
附Demo:sku算法demo
五,拓展一下