JavaScript实现从数组中选出和等于固定值的n个数


Posted in Javascript onSeptember 03, 2014

现实生活中的问题,可能会抽象为这样一种数据模型:

从一个数组中挑选出几个数,让这几个数相加的和为指定的值。

大多数读者应该有过网购的经历,网购一般会有个凑单功能,假如读者买了70元的商品,但是必须满100元才能包邮,这时系统会自动推荐一些商品,加起来差不多就100块钱了。

系统如何确定推荐哪些商品呢?这其实就是刚刚提到的模型,我们可以把热销商品的价格放到一个数组中,然后利用算法,找出数组中哪些价格的和为30元。

废话少说,小菜给大家分享一个JavaScript版本的算法实现。

算法代码:

function getCombBySum(array,sum,tolerance,targetCount){
var util = {
/*
get combination from array
arr: target array
num: combination item length
return: one array that contain combination arrays
*/
getCombination: function(arr, num) {
var r=[];
(function f(t,a,n)
{
if (n==0)
{
return r.push(t);
}
for (var i=0,l=a.length; i<=l-n; i++)
{
f(t.concat(a[i]), a.slice(i+1), n-1);
}
})([],arr,num);
return r;
},
//take array index to a array
getArrayIndex: function(array) {
var i = 0,
r = [];
for(i = 0;i<array.length;i++){
r.push(i);
}

return r;
}
},logic = {
//sort the array,then get what's we need
init: function(array,sum) {
//clone array
var _array = array.concat(),
r = [],
i = 0;
//sort by asc
_array.sort(function(a,b){
return a - b;
});
//get all number when it's less than or equal sum
for(i = 0;i<_array.length;i++){
if(_array[i]<=sum){
r.push(_array[i]);
}else{
break;
}
}

return r;
},
//important function
core: function(array,sum,arrayIndex,count,r){
var i = 0,
k = 0,
combArray = [],
_sum = 0,
_cca = [],
_cache = [];

if(count == _returnMark){
return;
}
//get current count combination
combArray = util.getCombination(arrayIndex,count);
for(i = 0;i<combArray.length;i++){
_cca = combArray[i];
_sum = 0;
_cache = [];
//calculate the sum from combination
for(k = 0;k<_cca.length;k++){
_sum += array[_cca[k]];
_cache.push(array[_cca[k]]);
}
if(Math.abs(_sum-sum) <= _tolerance){
r.push(_cache);
} 
}

logic.core(array,sum,arrayIndex,count-1,r);
}

},
r = [],
_array = [],
_targetCount = 0,
_tolerance = 0,
_returnMark = 0;

//check data
_targetCount = targetCount || _targetCount;
_tolerance = tolerance || _tolerance;

_array = logic.init(array,sum);
if(_targetCount){
_returnMark = _targetCount-1;
}

logic.core(_array,sum,util.getArrayIndex(_array),(_targetCount || _array.length),r);

return r;
}

调用说明:

array: 数据源数组。必选。

sum: 相加的和。必选。

tolerance: 容差。如果不指定此参数,则相加的和必须等于sum参数,指定此参数可以使结果在容差范围内浮动。可选。

targetCount: 操作数数量。如果不指定此参数,则结果包含所有可能的情况,指定此参数可以筛选出固定数量的数相加,假如指定为3,那么结果只包含三个数相加的情况。可选。

返回值:返回的是数组套数组结构,内层数组中的元素是操作数,外层数组中的元素是所有可能的结果。

Javascript 相关文章推荐
accesskey 提交
Jun 26 Javascript
javascript笔试题目附答案@20081025_jb51.net
Oct 26 Javascript
基于jQuery判断两个元素是否有重叠部分的代码
Jul 25 Javascript
扩展JS Date对象时间格式化功能的小例子
Dec 02 Javascript
单击和双击事件的冲突处理示例代码
Apr 03 Javascript
js实现跨域的方法实例详解
Jun 24 Javascript
Jquery中request和request.form和request.querystring的区别
Nov 26 Javascript
基于Bootstrap实现tab标签切换效果
Apr 15 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
Mar 26 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
Aug 29 Javascript
小程序云开发获取不到数据库记录的解决方法
May 18 Javascript
微信小程序中target和currentTarget的区别小结
Nov 06 Javascript
JavaScript实现找出数组中最长的连续数字序列
Sep 03 #Javascript
js实现的类似于asp数据字典的数据类型代码实例
Sep 03 #Javascript
jQuery表格列宽可拖拽改变且兼容firfox
Sep 03 #Javascript
Egret引擎开发指南之视觉编程
Sep 03 #Javascript
Egret引擎开发指南之发布项目
Sep 03 #Javascript
Egret引擎开发指南之运行项目
Sep 03 #Javascript
JavaScript实现找出字符串中第一个不重复的字符
Sep 03 #Javascript
You might like
php查询相似度最高的字符串的方法
2015/03/12 PHP
PHP IDE phpstorm 常用快捷键
2015/05/18 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
2015/08/18 PHP
PHP利用APC模块实现大文件上传进度条的方法
2015/10/29 PHP
Laravel5权限管理方法详解
2016/07/26 PHP
日期 时间js控件
2009/05/07 Javascript
jQuery动态设置form表单的enctype值(实现代码)
2013/07/04 Javascript
jquery插件jTimer(jquery定时器)使用方法
2013/12/23 Javascript
JS和函数式语言的三特性
2014/03/05 Javascript
模拟一个类似百度google的模糊搜索下拉列表
2014/04/15 Javascript
推荐8款jQuery轻量级树形Tree插件
2014/11/12 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
2014/12/18 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
jquery实现数字输入框
2017/02/22 Javascript
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
Vue中添加过渡效果的方法
2017/03/16 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
2017/06/11 Javascript
node.js实现为PDF添加水印的示例代码
2018/12/05 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
微信小程序获取用户绑定手机号方法示例
2019/07/21 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
js实现提交前对列表数据的增删改查
2020/01/16 Javascript
在Python的Flask框架下收发电子邮件的教程
2015/04/21 Python
Python从MP3文件获取id3的方法
2015/06/15 Python
请不要重复犯我在学习Python和Linux系统上的错误
2016/12/12 Python
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
2020/02/15 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
2020/09/01 Python
CSS3媒体查询Media Queries基础学习教程
2016/02/29 HTML / CSS
初三新学期计划书
2014/05/03 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
地震慰问信
2015/02/14 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript
Python 恐龙跑跑小游戏实现流程
2022/02/15 Python