记一次sku规格简单实现

市面上大多数的sku算法实现方式 都是把sku转换成对象的方式
而我这个是让它自己找 不需要你写什么算法 也没有复杂的嵌套逻辑 非常简单

1.代码结构

{
                "id":"1240167138390765568",
                "typeCode":"sj",
                "typeName":"手机",
                "name":"Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待",
                "title":"建议选购换修无忧月付版首月免费,送杀菌率99.9%手机消毒片!自动订阅,随时可取消!",
                "pic":"[http://img2.sunf.xyz/upload/ohcimeqe/1240161785334788098.jpg](http://img2.sunf.xyz/upload/ohcimeqe/1240161785334788098.jpg)",
                "shareImg":"[http://img2.sunf.xyz/upload/krdl91zg/1240161785334788098.jpg](http://img2.sunf.xyz/upload/krdl91zg/1240161785334788098.jpg)",
                "img":"[http://img2.sunf.xyz/upload/ubxhp6ov/1240161785334788098.jpg](http://img2.sunf.xyz/upload/ubxhp6ov/1240161785334788098.jpg)",
                "prodArea":"中国华强北",
                "price":1,
                "marketPrice":1,
                "content":null,
                "upDown":"0",
                "shopId":"1239475068401594368",
                "shopName":"测试店铺",
                "stock":9987,
                "sales":14,
                "activity":"0",
                "sort":1,
                "skuLevel":3,
                "labels":"",
                "groupaName":"颜色",
                "groupbName":"容量",
                "groupcName":"购买方式",
                "version":null,
                "area":"330203,330206,330212,330282",
                "farmGoodsSkuList":[
                    {
                        "id":"1240168206289924096",
                        "name":"Apple iPhone 11 Pro Max (A2220) 64GB 暗夜绿色 移动联通电信4G手机 双卡双待",
                        "pic":"[http://img2.sunf.xyz/upload/1kf2kx9g/1240161785334788098.jpg](http://img2.sunf.xyz/upload/1kf2kx9g/1240161785334788098.jpg)",
                        "goodsId":"1240167138390765568",
                        "groupa":"暗夜绿色",
                        "groupb":"64GB",
                        "groupc":"公开版",
                        "groupProp":null,
                        "oriPrice":9599,
                        "marketPrice":9599,
                        "price":9599,
                        "stock":9999,
                        "sales":0,
                        "sort":1,
                        "saleNum":null
                    },
                    {
                        "id":"1240168339316469760",
                        "name":"Apple iPhone 11 Pro Max (A2220) 256GB 暗夜绿色  移动联通电信4G手机 双卡双待Apple iPhone 11 Pro Max (A2220) 256GB 暗夜",
                        "pic":"[http://img2.sunf.xyz/upload/r454molf/1240161785334788098.jpg](http://img2.sunf.xyz/upload/r454molf/1240161785334788098.jpg)",
                        "goodsId":"1240167138390765568",
                        "groupa":"暗夜绿色",
                        "groupb":"256GB",
                        "groupc":"公开版",
                        "groupProp":null,
                        "oriPrice":10899,
                        "marketPrice":10899,
                        "price":10899,
                        "stock":9999,
                        "sales":0,
                        "sort":2,
                        "saleNum":null
                    },
                    {
                        "id":"1240168541117018112",
                        "name":"Apple iPhone 11 Pro Max (A2220) 256GB 暗夜绿色 移动联通电信4G手机 双卡双待",
                        "pic":"[http://img2.sunf.xyz/upload/gs3u46ii/1240161785334788098.jpg](http://img2.sunf.xyz/upload/gs3u46ii/1240161785334788098.jpg)",
                        "goodsId":"1240167138390765568",
                        "groupa":"暗夜绿色",
                        "groupb":"512GB",
                        "groupc":"公开版",
                        "groupProp":null,
                        "oriPrice":10899,
                        "marketPrice":10899,
                        "price":10899,
                        "stock":9999,
                        "sales":0,
                        "sort":3,
                        "saleNum":null
                    },
                    {
                        "id":"1240169698619092992",
                        "name":"【换修无忧月付版】Apple iPhone 11 Pro Max (A2220) 256GB 暗夜绿色 移动联通电信4G手机 双卡双待",
                        "pic":"[http://img2.sunf.xyz/upload/ys7132fi/1240161785334788098.jpg](http://img2.sunf.xyz/upload/ys7132fi/1240161785334788098.jpg)",
                        "goodsId":"1240167138390765568",
                        "groupa":"暗夜绿色",
                        "groupb":"256GB",
                        "groupc":"换修无忧月付版",
                        "groupProp":null,
                        "oriPrice":10899,
                        "marketPrice":10899,
                        "price":10899,
                        "stock":9987,
                        "sales":14,
                        "sort":3,
                        "saleNum":null
                    },
                    {
                        "id":"1240170089565974528",
                        "name":"【换修无忧月付版】Apple iPhone 11 Pro Max (A2220) 64GB 暗夜绿色 移动联通电信4G手机 双卡双待",
                        "pic":"[http://img2.sunf.xyz/upload/b3znfnn8/1240161785334788098.jpg](http://img2.sunf.xyz/upload/b3znfnn8/1240161785334788098.jpg)",
                        "goodsId":"1240167138390765568",
                        "groupa":"暗夜绿色",
                        "groupb":"64GB",
                        "groupc":"换修无忧月付版",
                        "groupProp":null,
                        "oriPrice":9599,
                        "marketPrice":9599,
                        "price":9599,
                        "stock":9999,
                        "sales":0,
                        "sort":3,
                        "saleNum":null
                    },
                    {
                        "id":"1240170377114873856",
                        "name":"【换修无忧月付版】Apple iPhone 11 Pro Max (A2220) 512GB 暗夜绿色 移动联通电信4G手机 双卡双待",
                        "pic":"[http://img2.sunf.xyz/upload/emkvnfbx/1240161785334788098.jpg](http://img2.sunf.xyz/upload/emkvnfbx/1240161785334788098.jpg)",
                        "goodsId":"1240167138390765568",
                        "groupa":"暗夜绿色",
                        "groupb":"512GB",
                        "groupc":"换修无忧月付版",
                        "groupProp":null,
                        "oriPrice":12699,
                        "marketPrice":12699,
                        "price":12699,
                        "stock":9999,
                        "sales":0,
                        "sort":4,
                        "saleNum":null
                    },
                    {
                        "id":"1242629772762685440",
                        "name":"暗夜红",
                        "pic":"[http://img2.sunf.xyz/upload/alxesi0k/1241972007737212930.jpg](http://img2.sunf.xyz/upload/alxesi0k/1241972007737212930.jpg)",
                        "goodsId":"1240167138390765568",
                        "groupa":"暗夜红",
                        "groupb":"1",
                        "groupc":"贷款",
                        "groupProp":null,
                        "oriPrice":1,
                        "marketPrice":1,
                        "price":1,
                        "stock":9999,
                        "sales":0,
                        "sort":1,
                        "saleNum":null
                    }
                ],
                "farmShop":null
            },

后台通过返回一个
skuLevel跟farmGoodsSkuList字段来控制对应的sku展示
skuLevel对应你要读取farmGoodsSkuList数组中每个对象的a,b,c字段 按照长度来分割

// 这里就是将筛选出来的数据进行合并的地方
  getSkuGroup = (list, skuLevel) => {
    return list.map((e) => {
      const arr = ['a', 'b', 'c'].slice(0, skuLevel)
      return arr.reduce((a, b,index) => {
        return a + e['group' + b] + ((index <= skuLevel - 1 ) ? ',' : '' )
      }, '')
    })
  }

  // 4.从列表筛选出包含skuName的数据以后 然后将数据进行合并处理
  // 如 我筛选出来全部包含2gb的规格 但是这些规格分别包含在
groupa,groupb,groupc这几个字段里面 我需要根据skuLevel将这些字段进行合并
变成['黑色','2gb','256gb']
  getFilterSkuItemList = ({ list, item, name, skuLevel } = {}) => {
    const data = this.getSkuGroup(list.filter((el) => el['group' + name] == item['group' + name]), skuLevel)
    return data
  }

  getSkuItemData = (name, list, isEnd, skuLevel) => {
    // 3.这里使用lodash将每一行的数据进行合并 得到一个去重以后的行数据
   比如一行里面有两个2GB会将其进行合并
    const filterData = uniqBy(list, 'group' + name)
    return filterData.map((e) => (
      {
        ...e,
        // 合并以后 你就可以根据当前所在规格是第几行拿对应数据的skuName
        name: e['group' + name],
        // 这里是整个算法的核心
       // 这里实现的非常简单 就是通过自己skuName 然后在list里面找 只要跟这个名字相关的 我就认为这个肯定是跟sku绑定的如 我现在所在的sku规格是2gb的 那么我只要搜索出所有跟2gb有关的规格 那么必定就是有效的 在后面判断是否禁用非常有用
        skuData: this.getFilterSkuItemList({ list, item: e, name, skuLevel })
      }
    ))
  }
  
 //2.上一步拿到分组以后 在这里解析分组结构 因为已经知道每个分组是属于a,b,c哪一行了 所以这边直接遍历指定行就能拿到对应标题跟每一行的数据
  findSkuData = (name, findData, isEnd, skuLevel) => {
    return {
      title: findData['group' + name + 'Name'],
      data: this.getSkuItemData(name, findData.farmGoodsSkuList, isEnd, skuLevel)
    }
  }

  getSkuList = (data) => {
    const { skuLevel } = data
    // 1.这里通过skuLevel并且使用数组截取的方式来遍历得到一个分组 
    return ['a', 'b', 'c'].slice(0, skuLevel).map((e, i) => this.findSkuData(e, data, i == skuLevel - 1, skuLevel))
  }

上面的东西简单几步就是
1.筛选出你的规格楼层
2.根据你的规格楼层每一个子项的skuName 筛选出所有包含这个skuName的规格
3.然后将规格进行重组变成一个数组并保存起来
4.每次点击的时候 将你当前已经被选中的skuName跟每个item的skuData比较
如你的skuData是['黑色','2gb','256'] 你当前选了['黑色','','']
那么将你的选中的结果去空以后 变成['黑色'] 然后跟['黑色','2gb','256'] 比较 只要黑色包含在里面 我就认为你这个skuItem是不需要禁用的 否则应该禁用
代码如下

  // skuData就是每个skuItem所保存的符合条件的值
  getSkuButtonDisable = (skuData) => {
    const { skuText = '' } = this.state
   // 先进行一下去空
    const skuTextArr = skuText.split(',').filter((e)=>e)
    if (skuTextArr.length == 0) return false
    return !skuData.some((e) => {
      if (skuText) {
       //转换skuData的每一项为数组 并且跟skuTextArr做比较 如果有任意一个条件在里面的话 就变成可用 反之全部禁用 
        return e.split(',').some((e) => skuTextArr.indexOf(e) !== -1)
      } else {
        return true
      }
    })
  }

至此所有的sku功能全部就实现了 包括了禁用启用跟sku的选中之类的整套流程
代码不多 如果有问题 可以加我qq:469373256

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容