JavaScript算法教程之sku(库存量单位)详解


Posted in Javascript onJune 29, 2017

前言

这几天公司出的题目,之前项目中写过一个类似的,但是写的很猥琐(一些表现是通过频繁操作DOM实现的),借着有奖励的机会重写了一下。

sku:

SKU=Stock Keeping Unit(库存量单位)。即库存进出计量的基本单元,可以是以件,盒,托盘等为单位。SKU这是对于大型连锁超市DC(配送中心)物流管理的一个必要的方法。现在已经被引申为产品统一编号的简称,每种产品均对应有唯一的SKU号。单品:对一种商品而言,当其品牌、型号、配置、等级、花色、包装容量、单位、生产日期、保质期、用途、价格、产地等属性与其他商品存在不同时,可称为一个单品。

以上摘自百度百科

思路:

通过字典键值对(在JavaScript中即是Object数据类型)的方式来查找对应可选属性。

难点:

在于所确定属性的同级可选属性。

实现步骤:

  1. 将拿到的数据重新组织成需要展示的数据格式、计算使用的字典数据格式、以及计算过程中需要的一些辅助数据。
  2. 获取页面的所选的属性。
  3. 根据所选属性组成查找key来查找结果。
  4. 将结果缓存,方便下次加速查找。
  5. 表现到页面。
  6. 确定商品。

核心代码:

/**
 * 得到结果
 * @param {string} key 查找关键字以;分割
 * @return {array} 所有可选属性数组
*/
getResult(key, isRealFind = true) {
 // 如缓存中存在,则直接返回结果
 if (this.cacheData[key] && isRealFind) {
 this.result = this.cacheData[key];
 this.resultID = this.goodsDict[key] ? this.goodsDict[key] : '';
 console.log(this.resultID);
 return this.result;
 }
 // 继续查找
 let result = '';
 for (let _key in this.goodsDict) {
 let keyArr = key.split(';');
 let _keyArr = _key.split(';');
 let arr = keyArr.concat(_keyArr);
 arr = Array.from(new Set(arr));
 if (arr.length === _keyArr.length) {
 result += _key;
 }
 }
 if (isRealFind) {
 // 所有可选属性
 this.result = result.split(';');
 let _keyArr = key.split(';');
 if (_keyArr[_keyArr.length - 1] === '') {
 _keyArr.pop();
 }
 for (let i = 0; i < _keyArr.length; i++) {
 let _arr = key.split(';');
 let str = _arr.splice(i, 1);
 let oldResult = this.getResult(_arr.join(';'), false);
 let index = '';
 // 获取该key所在索引
 this.allKeys.forEach((item, i) => {
 if (item.indexOf(str.join('')) !== -1) {
  index = i;
  return;
 }
 });
 this.allKeys[index].forEach(item => {
 if (oldResult.indexOf(item) !== -1) {
  this.result.push(item);
 }
 });
 }
 this.result = Array.from(new Set(this.result));
 // 缓存数据
 this.cacheData[key] = this.result;
 this.resultID = this.goodsDict[key] ? this.goodsDict[key] : '';
 console.log(this.resultID);
 return this.result;
 } else {
 return result;
 }
}

github地址 (应该拉下来就能跑,页面展示用的jQuery,因为当前项目需要,换成mvvm框架页面表现会更加简单)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
javascript textarea光标定位方法(兼容IE和FF)
Mar 12 Javascript
基于jQuery的计算文本框字数的代码
Jun 06 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
Nov 04 Javascript
js中array的sort()方法使用介绍
Feb 20 Javascript
jQuery实现图片渐入渐出切换展示效果
Aug 15 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
Oct 08 Javascript
自学实现angularjs依赖注入
Dec 20 Javascript
xmlplus组件设计系列之图标(ICON)(1)
May 05 Javascript
原生JS实现 MUI导航栏透明渐变效果
Nov 07 Javascript
浅谈webpack下的AOP式无侵入注入
Nov 12 Javascript
jQuery位置选择器用法实例分析
Jun 28 jQuery
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
Sep 28 Javascript
详解webpack自动生成html页面
Jun 29 #Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
Jun 29 #Javascript
详解webpack分包及异步加载套路
Jun 29 #Javascript
JavaScript之map reduce_动力节点Java学院整理
Jun 29 #Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
Jun 29 #Javascript
JavaScript之iterable_动力节点Java学院整理
Jun 29 #Javascript
JavaScript之Map和Set_动力节点Java学院整理
Jun 29 #Javascript
You might like
十天学会php之第二天
2006/10/09 PHP
php中运用http调用的GET和POST方法示例
2014/09/29 PHP
在Mac上编译安装PHP7的开发环境
2015/07/28 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
JavaScript动态创建link标签到head里的方法
2014/12/22 Javascript
js实现照片墙功能实例
2015/02/05 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
Bootstrap基本组件学习笔记之进度条(15)
2016/12/08 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
深入探究node之Transform
2017/07/20 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
Bootstrap table使用方法汇总
2017/11/17 Javascript
react-router v4如何使用history控制路由跳转详解
2018/01/09 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
基于Python __dict__与dir()的区别详解
2017/10/30 Python
win8.1安装Python 2.7版环境图文详解
2019/07/01 Python
Python编译为二进制so可执行文件实例
2019/12/23 Python
python numpy库np.percentile用法说明
2020/06/08 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
Python实现壁纸下载与轮换
2020/10/19 Python
python 下划线的不同用法
2020/10/24 Python
连卡佛中国官网:Lane Crawford中文站
2018/01/27 全球购物
设计师珠宝:Ylang 23
2018/05/11 全球购物
几个MySql的面试题
2013/04/22 面试题
市场营销专业个人自荐信格式
2013/09/21 职场文书
教师自我反思材料
2014/02/14 职场文书
开学典礼决心书
2014/03/11 职场文书
大专生求职信
2014/06/29 职场文书
Python 流媒体播放器的实现(基于VLC)
2021/04/28 Python