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
理解Javascript_01_理解内存分配原理分析
Oct 11 Javascript
中文字符串截取的js函数代码
Apr 17 Javascript
JavaScript中的lastIndexOf()方法使用详解
Jun 06 Javascript
js判断文件格式及大小的简单实例(必看)
Oct 11 Javascript
JavaScript标准对象_动力节点Java学院整理
Jun 27 Javascript
js核心基础之构造函数constructor用法实例分析
May 11 Javascript
vux-scroller实现移动端上拉加载功能过程解析
Oct 08 Javascript
angularjs模态框的使用代码实例
Dec 20 Javascript
React中Ref 的使用方法详解
Apr 28 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
Jul 13 Javascript
VUE中V-IF条件判断改变元素的样式操作
Aug 09 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读取txt文件的内容并赋值给数组的代码
2011/11/03 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
php中通过数组进行高效随机抽取指定条记录的算法
2013/09/09 PHP
php通过字符串调用函数示例
2014/03/02 PHP
php判断邮箱地址是否存在的方法
2016/02/13 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
PHP第三方登录―QQ登录实现方法
2017/02/06 PHP
深入浅析PHP的session反序列化漏洞问题
2017/06/15 PHP
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
javascript(jquery)利用函数修改全局变量的代码
2009/11/02 Javascript
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
javascript中的注释使用与注意事项小结
2011/09/20 Javascript
javascript的数据类型、字面量、变量介绍
2012/05/23 Javascript
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
JQuery中Bind()事件用法分析
2015/05/05 Javascript
JavaScript实现通过select标签跳转网页的方法
2016/09/29 Javascript
JavaScript页面实时显示当前时间实例代码
2016/10/23 Javascript
JavaScript 数组的深度复制解析
2016/11/02 Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
2017/03/14 Javascript
JS实现上传图片的三种方法并实现预览图片功能
2017/07/14 Javascript
js字符串倒序的实例代码
2018/11/30 Javascript
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
2019/10/26 Javascript
Vue的data、computed、watch源码浅谈
2020/04/04 Javascript
[01:03:36]Ti4 循环赛第三日DK vs Titan
2014/07/12 DOTA
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
Python学习笔记(二)基础语法
2014/06/06 Python
python k-近邻算法实例分享
2014/06/11 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
详解【python】str与json类型转换
2019/04/29 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
python使用建议技巧分享(三)
2020/08/18 Python
关于python scrapy中添加cookie踩坑记录
2020/11/17 Python
size?荷兰官方网站:英国高级运动鞋精品店
2020/07/24 全球购物
企业晚会策划方案
2014/05/29 职场文书