基于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 相关文章推荐
走出JavaScript初学困境—js初学
Dec 29 Javascript
JavaScript Event学习第四章 传统的事件注册模型
Feb 07 Javascript
js导出txt示例代码
Jan 14 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
Aug 07 Javascript
javascript正则表达式中的replace方法详解
Apr 20 Javascript
简单介绍jsonp 使用小结
Jan 27 Javascript
jQuery使用经验小技巧(推荐)
May 31 Javascript
使用递归遍历对象获得value值的实现方法
Jun 14 Javascript
使用node.js搭建服务器
May 20 Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
Jun 02 Javascript
vuex页面刷新后数据丢失的方法
Jan 17 Javascript
详解用场景去理解函数柯里化(入门篇)
Apr 11 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实现ftp上传文件示例
2014/08/21 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
JavaScript 调试器简介
2009/02/21 Javascript
jquery 简单导航实现代码
2009/09/11 Javascript
面向对象的javascript(笔记)
2009/10/06 Javascript
Jquery中dialog属性小记
2010/09/03 Javascript
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
2012/07/17 Javascript
js动态修改整个页面样式达到换肤效果
2014/05/23 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
Centos6.8下Node.js安装教程
2017/05/12 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
2017/09/30 Javascript
浅谈NodeJs之数据库异常处理
2017/10/25 NodeJs
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
jQuery实现获取及设置CSS样式操作详解
2018/09/05 jQuery
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
layui表格内放置图片,并点击放大的实例
2019/09/10 Javascript
Element Cascader 级联选择器的使用示例
2020/07/27 Javascript
jquery+ajax实现异步上传文件显示进度条
2020/08/17 jQuery
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
pandas.DataFrame.to_json按行转json的方法
2018/06/05 Python
python实现点对点聊天程序
2018/07/28 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
python实现飞机大战游戏
2020/10/26 Python
Html5跳转到APP指定页面的实现
2020/01/14 HTML / CSS
Java的五个基础面试题
2016/02/26 面试题
软件测试题目
2013/02/27 面试题
汽车技术服务英文求职信范文
2014/01/02 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
活动经费申请报告
2015/05/15 职场文书
生命的关键成分来自太空?陨石说是的
2022/04/29 数码科技
MySQL批量更新不同表中的数据
2022/05/11 MySQL
Java实现添加条码或二维码到Word文档
2022/06/01 Java/Android