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 相关文章推荐
JQuery Ajax通过Handler访问外部XML数据的代码
Jun 01 Javascript
jquery 单引号和双引号的区别及使用注意
Jul 31 Javascript
JavaScript定义类的几种方式总结
Jan 06 Javascript
js获取UserControl内容为拼html时提供方便
Nov 02 Javascript
node.js中的fs.rename方法使用说明
Dec 16 Javascript
javascript正则表达式之search()用法实例
Jan 19 Javascript
jQuery实现单击和鼠标感应事件
Feb 01 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
Mar 30 Javascript
js代码验证手机号码和电话号码是否合法
Jul 30 Javascript
通用无限极下拉菜单的实现代码
May 31 Javascript
不使用 JS 匿名函数理由
Nov 17 Javascript
详解vue beforeEach 死循环问题解决方法
Feb 25 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 in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
PHP gbk环境下json_dencode传送来的汉字
2012/11/13 PHP
PHP命名空间(Namespace)的使用详解
2013/05/04 PHP
深入浅析yii2-gii自定义模板的方法
2016/04/26 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
jQuery 幻灯片插件(带缩略图功能)
2011/01/24 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
2011/07/10 Javascript
jquery获取焦点和失去焦点事件代码
2013/04/21 Javascript
jQuery新窗口打开外链接
2016/07/21 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
xcode中获取js文件的路径方法(推荐)
2016/11/05 Javascript
bootstrap导航栏、下拉菜单、表单的简单应用实例解析
2017/01/06 Javascript
vue.js单页面应用实例的简单实现
2017/04/10 Javascript
浅谈JS中的常用选择器及属性、方法的调用
2017/07/28 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
2017/11/12 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
js中DOM事件绑定分析
2018/03/18 Javascript
详解webpack loader和plugin编写
2018/10/12 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
python3.0 字典key排序
2008/12/24 Python
Django 拆分model和view的实现方法
2019/08/16 Python
Python爬虫之Selenium多窗口切换的实现
2020/12/04 Python
html5与css3小应用
2013/04/03 HTML / CSS
英国电气世界:Electrical World
2019/09/08 全球购物
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
如何利用cmp命令比较文件
2013/09/23 面试题
30年同学聚会邀请函
2014/01/25 职场文书
预备党员政审材料
2014/02/04 职场文书
大学新生军训方案
2014/05/03 职场文书
放弃继承权公证书
2015/01/23 职场文书
2015年小学开学寄语
2015/02/27 职场文书
2015年平安创建工作总结
2015/04/29 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis
MySQL中正则表达式(REGEXP)使用详解
2022/07/07 MySQL