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 相关文章推荐
jQuery获得内容和属性示例代码
Jan 16 Javascript
用javascript实现自动输出网页文本
Jul 30 Javascript
快速学习jQuery插件 Form表单插件使用方法
Dec 01 Javascript
js仿iphone秒表功能 计算平均数
Jan 11 Javascript
JS常用倒计时代码实例总结
Feb 07 Javascript
JavaScript的六种继承方式(推荐)
Jun 26 Javascript
Vue项目中引入外部文件的方法(css、js、less)
Jul 24 Javascript
Angular中的ng-template及angular 使用ngTemplateOutlet 指令的方法
Aug 08 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
Feb 17 Javascript
vue实现局部刷新的实现示例
Apr 16 Javascript
jQuery实现弹幕特效
Nov 29 jQuery
vue+elementUI 实现内容区域高度自适应的示例
Sep 26 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格式化工具Beautify PHP小小BUG
2008/04/24 PHP
PHP实现时间轴函数代码
2011/10/08 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
让浏览器DOM元素最后加载的js方法
2014/07/29 Javascript
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
JS函数arguments数组获得实际传参数个数的实现方法
2016/05/28 Javascript
基于JavaScript实现复选框的全选和取消全选
2017/02/09 Javascript
javascript中apply/call和bind的使用
2017/02/15 Javascript
Angular.js之作用域scope'@','=','&amp;'实例详解
2017/02/28 Javascript
微信小程序商城项目之购物数量加减(3)
2017/04/17 Javascript
Angularjs使用过滤器完成排序功能
2017/09/20 Javascript
在vue项目中引用Iview的方法
2018/09/14 Javascript
elementUI 动态生成几行几列的方法示例
2019/07/11 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
你不可不知的Vue.js列表渲染详解
2019/10/01 Javascript
详解vue中v-on事件监听指令的基本用法
2020/07/22 Javascript
Python 专题一 函数的基础知识
2017/03/16 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
Django压缩静态文件的实现方法详析
2018/08/26 Python
python实现对图片进行旋转,放缩,裁剪的功能
2019/08/07 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
如何对python的字典进行排序
2020/06/19 Python
HTML5页面直接调用百度地图API获取当前位置直接导航目的地的实现代码
2018/03/02 HTML / CSS
次世代生活态度:Hypebeast
2018/07/05 全球购物
中西医专业毕业生职业规划书
2014/02/24 职场文书
大学新生入学教育方案
2014/05/16 职场文书
爱国教育主题班会
2015/08/14 职场文书
Axios取消重复请求的方法实例详解
2021/06/15 Javascript