基于JS实现的笛卡尔乘积之商品发布


Posted in Javascript onMay 13, 2016

没给大家介绍正文之前先给大家补充点知识:

js笛卡尔积算法

根据给的对象或者数组生成笛卡尔积

//笛卡儿积组合
function descartes(list)
{
//parent上一级索引;count指针计数
var point = {};
var result = [];
var pIndex = null;
var tempCount = 0;
var temp = [];
//根据参数列生成指针对象
for(var index in list)
{
if(typeof list[index] == 'object')
{
point[index] = {'parent':pIndex,'count':0}
pIndex = index;
}
}
//单维度数据结构直接返回
if(pIndex == null)
{
return list;
}
//动态生成笛卡尔积
while(true)
{
for(var index in list)
{
tempCount = point[index]['count'];
temp.push(list[index][tempCount]);
}
//压入结果数组
result.push(temp);
temp = [];
//检查指针最大值问题
while(true)
{
if(point[index]['count']+1 >= list[index].length)
{
point[index]['count'] = 0;
pIndex = point[index]['parent'];
if(pIndex == null)
{
return result;
}
//赋值parent进行再次检查
index = pIndex;
}
else
{
point[index]['count']++;
break;
}
}
}
}

好了,关于js笛卡尔积算法只是给下文做个铺垫,不多说了,言归正传。

一、需求描述

电商网站的商品发布功能,类似京东的商品详细页,如下图,这样的可选择功能,在后台是如何生成的呢,其实你看到的一个iphone6在发布时并不只是发布一个商品,而是很多个,因为每一个选择出来的iphone6价格是不一样的,那么发布商品时这些可选择项又是从一堆属性和属性值中挑选出来的,问题来了,发布时挑选的属性个数是不一样的,属性值也是不一样的,那么生成的商品个数是根据属性和属性值组合出来的。

基于JS实现的笛卡尔乘积之商品发布

二、直接上代码

<script>
/**
* 商品属性类型
* 一个属性个数是不确定的
*/
var Spec = function(specName,specItems){
this.specName = specName; //属性名称
this.specItems = specItems;//数值值,是个数组,数组个数不确定
}
var result = [];//组合成产品集
/**
* 发布一款商品选择的一个属性,这是一个规格数组,数组个数不确定
* 根据这个选择的属性组合成不同的产品
*/
var selectSpec = [{specName:'容量',specItems:['16G','64G','128G']},
{specName:'颜色',specItems:['土豪金','银色','黑色','pink']},
{specName:'网络',specItems:['联通','移动','电信']}];
function combine(index, current){
if (index < selectSpec.length - 1){
var specItem = selectSpec[index];
var keya = specItem.specName;
var items = specItem.specItems;
if(items.length==0){
run( index + 1, current);
}
for (var i = 0; i < items.length; i++){
if(!items[i])continue;
var newMap = {};
newMap = $.extend(newMap,current);
newMap[keya] = items[i];
run( index + 1, newMap);
}
}else if (index == selectSpec.length - 1){
var specItem = selectSpec[index];
var keya = specItem.specName;
var items = specItem.specItems;
if(items.length==0){
result.push(current);
}
for (var i = 0; i < items.length; i++){
if(!items[i])continue;
var newMap = {};
newMap = $.extend(newMap,current);
newMap[keya] = items[i];
result.push(newMap);
}
}
}
combine(0, {});
console.info(result);
/**组合成产品集
* [Object { 容量="16G", 颜色="土豪金", 网络="联通"}, 
* Object { 容量="16G", 颜色="土豪金", 网络="移动"}, 
* Object { 容量="16G", 颜色="土豪金", 网络="电信"},
* Object { 容量="16G", 颜色="银色", 网络="联通"},
* Object { 容量="16G", 颜色="银色", 网络="移动"}, 
* Object { 容量="16G", 颜色="银色", 网络="电信"}, 
* Object { 容量="16G", 颜色="黑色", 网络="联通"}, 
* Object { 容量="16G", 颜色="黑色", 网络="移动"}, 
* Object { 容量="16G", 颜色="黑色", 网络="电信"}, 
* Object { 容量="16G", 颜色="pink", 网络="联通"}, 
* Object { 容量="16G", 颜色="pink", 网络="移动"}, 
* Object { 容量="16G", 颜色="pink", 网络="电信"}, 
* Object { 容量="64G", 颜色="土豪金", 网络="联通"}, 
* Object { 容量="64G", 颜色="土豪金", 网络="移动"}, 
* Object { 容量="64G", 颜色="土豪金", 网络="电信"},
* Object { 容量="64G", 颜色="银色", 网络="联通"}, 
* Object { 容量="64G", 颜色="银色", 网络="移动"},
* Object { 容量="64G", 颜色="银色", 网络="电信"}, 
* Object { 容量="64G", 颜色="黑色", 网络="联通"}, 
* Object { 容量="64G", 颜色="黑色", 网络="移动"}, 
* Object { 容量="64G", 颜色="黑色", 网络="电信"}, 
* Object { 容量="64G", 颜色="pink", 网络="联通"}, 
* Object { 容量="64G", 颜色="pink", 网络="移动"}, 
* Object { 容量="64G", 颜色="pink", 网络="电信"}, 
* Object { 容量="128G", 颜色="土豪金", 网络="联通"}, 
* Object { 容量="128G", 颜色="土豪金", 网络="移动"}, 
* Object { 容量="128G", 颜色="土豪金", 网络="电信"}, 
* Object { 容量="128G", 颜色="银色", 网络="联通"}, 
* Object { 容量="128G", 颜色="银色", 网络="移动"}, 
* Object { 容量="128G", 颜色="银色", 网络="电信"}, 
* Object { 容量="128G", 颜色="黑色", 网络="联通"}, 
* Object { 容量="128G", 颜色="黑色", 网络="移动"}, 
* Object { 容量="128G", 颜色="黑色", 网络="电信"}, 
* Object { 容量="128G", 颜色="pink", 网络="联通"}, 
* Object { 容量="128G", 颜色="pink", 网络="移动"}, 
* Object { 容量="128G", 颜色="pink", 网络="电信"}]
*/
</script>

以上所述是小编给大家介绍的基于JS实现的笛卡尔乘积之商品发布的想内容,希望对大家有所帮助,同时也非常感谢大家对三水点靠木网站的支持,相信我们会做的更好!

Javascript 相关文章推荐
JQuery中Text方法用法实例分析
May 18 Javascript
JavaScript中使用concat()方法拼接字符串的教程
Jun 06 Javascript
谈谈AngularJs中的隐藏和显示
Dec 09 Javascript
JS比较两个数值的大小实例
Nov 25 Javascript
Angularjs中三种数据的绑定策略(“@”,“=”,“&amp;”)
Dec 23 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
Feb 08 Javascript
彻底理解js面向对象之继承
Feb 04 Javascript
JS求Number类型数组中最大元素方法
Apr 08 Javascript
vue + typescript + 极验登录验证的实现方法
Jun 27 Javascript
layui.tree组件的使用以及搜索节点功能的实现
Sep 26 Javascript
如何在postman测试用例中实现断言过程解析
Jul 09 Javascript
JavaScript 实现页面滚动动画
Apr 24 Javascript
基于jQuery倒计时插件实现团购秒杀效果
May 13 #Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
May 13 #Javascript
最简单的tab切换实例代码
May 13 #Javascript
浅析创建javascript对象的方法
May 13 #Javascript
全面理解JavaScript中的闭包
May 12 #Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
May 12 #Javascript
Node.js的项目构建工具Grunt的安装与配置教程
May 12 #Javascript
You might like
用PHP生成excel文件到指定目录
2015/06/22 PHP
微信公众号判断用户是否已关注php代码解析
2016/06/24 PHP
JavaScript 动态生成方法的例子
2009/07/22 Javascript
Javascript实现页面跳转的几种方式分享
2013/10/26 Javascript
利用cookie记住背景颜色示例代码
2013/11/04 Javascript
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
前台js调用后台方法示例
2013/12/02 Javascript
js实现键盘控制DIV移动的方法
2015/01/10 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
2015/09/02 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
jfinal与bootstrap的登出实战详解
2017/11/27 Javascript
javaScript canvas实现(画笔大小 颜色 橡皮的实例)
2017/11/28 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
微信小程序开发背景图显示功能
2018/08/08 Javascript
jQuery 操作 HTML 元素和属性的方法
2018/11/12 jQuery
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
2019/04/24 Javascript
Vue作用域插槽实现方法及作用详解
2020/07/08 Javascript
vue实现轮播图帧率播放
2021/01/26 Vue.js
python 字符串格式化代码
2013/03/17 Python
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
python django 原生sql 获取数据的例子
2019/08/14 Python
python科学计算之numpy——ufunc函数用法
2019/11/25 Python
关于numpy.where()函数 返回值的解释
2019/12/06 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
Python socket连接中的粘包、精确传输问题实例分析
2020/03/24 Python
英国著名的药妆网站:Escentual
2016/07/29 全球购物
佐卡伊官网:中国知名珠宝品牌
2017/02/05 全球购物
美国波西米亚风格服装品牌:Show Me Your Mumu
2018/01/05 全球购物
初中化学教学反思
2014/01/23 职场文书
七年级历史教学反思
2014/02/05 职场文书
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python
Python移位密码、仿射变换解密实例代码
2021/06/27 Python
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技