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中获取下个月一号,是星期几
Jun 01 Javascript
利用谷歌地图API获取点与点的距离的js代码
Oct 11 Javascript
JavaScript设计模式之外观模式介绍
Dec 28 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
Aug 27 Javascript
jquery validate demo 基础
Oct 29 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
Nov 09 Javascript
Vue.js教程之计算属性
Nov 11 Javascript
React Router基础使用
Jan 17 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
Sep 28 Javascript
js实现无缝轮播图效果
Mar 09 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
Aug 06 Javascript
jenkins自动构建发布vue项目的方法步骤
Jan 04 Vue.js
详解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 和 MySQL 开发的 8 个技巧
2006/10/09 PHP
php下使用SimpleXML 处理XML 文件
2010/02/27 PHP
PHP中使用正则表达式提取中文实现笔记
2015/01/20 PHP
PHP简单判断手机设备的方法
2016/08/23 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
2019/09/30 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
javascript生成/解析dom的CDATA类型的字段的代码
2007/04/22 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
js实现鼠标经过时图片滚动停止的方法
2015/02/16 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
Javascript单例模式的介绍和实例
2016/10/08 Javascript
JavaScript 实现的checkbox经典实例分享
2016/10/16 Javascript
Bootstrap BootstrapDialog使用详解
2017/02/17 Javascript
Vue分页组件实例代码
2017/04/17 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
JavaScript正则表达式的贪婪匹配和非贪婪匹配
2017/09/05 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
js中document.write和document.writeln的区别
2018/03/11 Javascript
微信公众号服务器验证Token步骤图解
2019/12/30 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
2020/03/16 Javascript
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
python笔记_将循环内容在一行输出的方法
2019/08/08 Python
Python3实现发送邮件和发送短信验证码功能
2020/01/07 Python
Pycharm IDE的安装和使用教程详解
2020/04/30 Python
德国在线订购鲜花:Fleurop
2018/08/25 全球购物
医学类个人求职信范文
2014/02/05 职场文书
公司年会抽奖活动主持词
2014/03/31 职场文书
教师党的群众路线学习心得体会
2014/11/04 职场文书
2015年基层党建工作汇报材料
2015/06/25 职场文书
变长双向rnn的正确使用姿势教学
2021/05/31 Python
设置IIS Express并发数
2022/07/07 Servers
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript