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 相关文章推荐
document.all与WEB标准
May 13 Javascript
EXTjs4.0的store的findRecord的BUG演示代码
Jun 08 Javascript
asp.net中oracle 存储过程(图文)
Aug 12 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
Oct 28 Javascript
js 自带的 map() 方法全面了解
Aug 16 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
Nov 02 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
Apr 11 Javascript
Vue实现一个返回顶部backToTop组件
Jul 25 Javascript
vue template中slot-scope/scope的使用方法
Sep 06 Javascript
完美解决vue 中多个echarts图表自适应的问题
Jul 19 Javascript
three.js 实现露珠滴落动画效果的示例代码
Mar 01 Javascript
JavaScript前端面试扁平数据转tree与tree数据扁平化
Jun 14 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
珊瑚虫IP库浅析
2007/02/15 PHP
php获取文件大小的方法
2014/02/26 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
2014/08/14 PHP
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
PDO::query讲解
2019/01/29 PHP
PHP 对象继承原理与简单用法示例
2020/04/21 PHP
Ext.MessageBox工具类简介
2009/12/10 Javascript
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
2016/06/21 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
JavaScript数组去重的6个方法
2017/01/21 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
2017/08/12 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
Vue中使用sass实现换肤功能
2018/09/07 Javascript
Vue起步(无cli)的啊教程详解
2019/04/11 Javascript
js实现全选反选不选功能代码详解
2019/04/24 Javascript
Vue-cli3简单使用(图文步骤)
2019/04/30 Javascript
vue实现按需加载组件及异步组件功能
2019/05/27 Javascript
Node.js API详解之 dgram模块用法实例分析
2020/06/05 Javascript
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
Python 编码处理-str与Unicode的区别
2016/09/06 Python
Python编程生成随机用户名及密码的方法示例
2017/05/05 Python
Python脚本按照当前日期创建多级目录
2019/03/01 Python
简单了解Python生成器是什么
2019/07/02 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
美国卡车、吉普车和SUV零件网站:4 Wheel Parts
2016/11/24 全球购物
Lampenwelt德国:欧洲领先的灯具和照明在线商店
2018/08/05 全球购物
远程教育心得体会
2014/01/03 职场文书
物业保安员岗位职责
2014/03/14 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
2014年远程教育工作总结
2014/12/09 职场文书
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android