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 对象的创建与使用
Mar 09 Javascript
js 操作select相关方法函数
Dec 06 Javascript
js跨域问题之跨域iframe自适应大小实现代码
Jul 17 Javascript
基于node.js的快速开发透明代理
Dec 25 Javascript
JS脚本defer的作用示例介绍
Jan 02 Javascript
JavaScript中getUTCSeconds()方法的使用详解
Jun 11 Javascript
jQuery原理系列-常用Dom操作详解
Jun 07 Javascript
javascript 组合按键事件监听实现代码
Feb 21 Javascript
微信小程序之数据双向绑定与数据操作
May 12 Javascript
Angular4学习笔记之准备和环境搭建项目
Aug 01 Javascript
koa2+vue实现登陆及登录状态判断
Aug 15 Javascript
Vue.js中provide/inject实现响应式数据更新的方法示例
Oct 16 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导入Excel到MySQL的方法
2011/04/23 PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
2013/06/29 PHP
浅析THINKPHP的addAll支持的最大数据量
2015/02/03 PHP
初识laravel5
2015/03/02 PHP
ThinkPHP中使用Ueditor富文本编辑器
2015/09/02 PHP
Yii2中DropDownList简单用法示例
2016/07/18 PHP
yii gridview实现时间段筛选功能
2017/08/15 PHP
让getElementsByName适应IE和firefox的方法
2007/09/24 Javascript
JavaScript CSS修改学习第六章 拖拽
2010/02/19 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
javascript中alert()与console.log()的区别
2015/08/26 Javascript
分享jQuery插件的学习笔记
2016/01/14 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
Zabbix添加Node.js监控的方法
2016/10/20 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
2016/12/22 Javascript
[03:22]DOTA2超级联赛专访单车:找到属于自己的英雄
2013/06/08 DOTA
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
python处理圆角图片、圆形图片的例子
2014/04/25 Python
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
Python实现将多个空格换为一个空格.md的方法
2018/12/20 Python
Python数据可视化教程之Matplotlib实现各种图表实例
2019/01/13 Python
numpy求平均值的维度设定的例子
2019/08/24 Python
浅谈keras的深度模型训练过程及结果记录方式
2020/01/24 Python
Python ConfigParser模块的使用示例
2020/10/12 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
python 基于DDT实现数据驱动测试
2021/02/18 Python
使用css3 属性如何丰富图片样式(圆角 阴影 渐变)
2012/11/22 HTML / CSS
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
什么是makefile? 如何编写makefile?
2013/01/02 面试题
餐厅周年庆活动方案
2014/08/25 职场文书
2014年个人售房协议书
2014/10/30 职场文书
质检员岗位职责
2015/02/03 职场文书
《大禹治水》教学反思
2016/02/22 职场文书
亲情作文之母爱
2019/09/25 职场文书
利用 JavaScript 构建命令行应用
2021/11/17 Javascript