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 相关文章推荐
javascript之AJAX框架使用说明
Apr 24 Javascript
js弹出的对话窗口永远保持居中显示
Dec 15 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
Apr 18 Javascript
node.js中的fs.chmod方法使用说明
Dec 18 Javascript
Javascript添加监听与删除监听用法详解
Dec 19 Javascript
js简单实现标签云效果实例
Aug 06 Javascript
详解js跨域原理以及2种解决方案
Dec 09 Javascript
JavaScript中两个字符串的匹配
Jun 08 Javascript
详解react服务端渲染(同构)的方法
Sep 21 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
Dec 29 Javascript
JavaScript实现快速排序的方法分析
Jan 10 Javascript
Layui事件监听的实现(表单和数据表格)
Oct 17 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 中检查或过滤IP地址的实现代码
2011/11/27 PHP
深入php处理整数函数的详解
2013/06/09 PHP
总结PHP删除字符串最后一个字符的三种方法
2016/08/30 PHP
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
学习JavaScript设计模式(多态)
2015/11/25 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
纯JS实现弹性导航条效果
2017/03/06 Javascript
JavaScript数组_动力节点Java学院整理
2017/06/26 Javascript
postman+json+springmvc测试批量添加实例
2018/03/31 Javascript
vue自定义移动端touch事件之点击、滑动、长按事件
2018/07/10 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
javascript实现移动端上传图片功能
2020/08/18 Javascript
如何实现vue的tree组件
2020/12/03 Vue.js
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
Python 通过URL打开图片实例详解
2017/06/01 Python
django ajax json的实例代码
2018/05/29 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
python numpy 常用随机数的产生方法的实现
2019/08/21 Python
Tensorflow与Keras自适应使用显存方式
2020/06/22 Python
Python map及filter函数使用方法解析
2020/08/06 Python
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
优质美利奴羊毛袜,不只是徒步旅行:Darn Tough Vermont
2018/11/05 全球购物
日本乐天官方海外转运服务:Rakuten Global Express
2018/11/30 全球购物
MyBag中文网:英国著名的时尚包袋电商零售网站
2020/07/31 全球购物
小学生自我评价范例
2013/09/24 职场文书
乡镇干部十八大感言
2014/02/17 职场文书
公司领导班子对照检查材料
2014/09/24 职场文书
工作年限证明模板
2014/11/01 职场文书
餐厅营销的秘密:为什么老顾客会流水?
2019/08/08 职场文书
导游词之太原天龙山
2020/01/02 职场文书
抖音短视频(douyin)去水印工具的实现代码
2021/03/30 Javascript