基于JS实现的笛卡尔乘积之商品发布
来源: 阅读:2581 次 日期:2016-07-01 09:41:27
温馨提示: 小编为您整理了“基于JS实现的笛卡尔乘积之商品发布”,方便广大网友查阅!

本文给大家介绍JS实现的笛卡尔乘积之商品发布的相关内容,涉及到js笛卡尔积算法的相关知识,本文介绍的非常详细,具有参考价值,感兴趣的朋友一起学习吧

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

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价格是不一样的,那么发布商品时这些可选择项又是从一堆属性和属性值中挑选出来的,问题来了,发布时挑选的属性个数是不一样的,属性值也是不一样的,那么生成的商品个数是根据属性和属性值组合出来的。

名单

二、直接上代码

<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实现的笛卡尔乘积之商品发布的想内容,希望对大家有所帮助

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:hfpxwx
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map