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 相关文章推荐
分享别人写的一个小型js框架
Aug 13 Javascript
JS的参数传递示例介绍
Feb 08 Javascript
JavaScript实现的简单拖拽效果
Jun 01 Javascript
jQuery Mobile中的button按钮组件基础使用教程
May 23 Javascript
AngularJS 依赖注入详解及示例代码
Aug 17 Javascript
使用bootstrap实现多窗口和拖动效果
Sep 22 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
Jan 19 Javascript
js date 格式化
Feb 15 Javascript
微信小程序自定义顶部组件customHeader的示例代码
Jun 03 Javascript
openlayers实现地图弹窗
Sep 25 Javascript
使用js获取身份证年龄的示例代码
Dec 11 Javascript
5种 JavaScript 方式实现数组扁平化
Oct 05 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
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
2014/08/21 PHP
php的sso单点登录实现方法
2015/01/08 PHP
PHP结合jQuery实现找回密码
2015/07/22 PHP
jQuery 自定义函数写法分享
2012/03/30 Javascript
node.js中的http.createServer方法使用说明
2014/12/14 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
JavaScript中Number.NEGATIVE_INFINITY值的使用详解
2015/06/05 Javascript
基于jquery实现最简单的选项卡切换效果
2016/05/08 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
详解node服务器中打开html文件的两种方法
2017/09/18 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
简述vue中的config配置
2018/01/23 Javascript
angular2路由之routerLinkActive指令【推荐】
2018/05/30 Javascript
如何使用pm2快速将项目部署到远程服务器
2019/03/12 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
分享Angular http interceptors 拦截器使用(推荐)
2019/11/10 Javascript
前端深入理解Typescript泛型概念
2020/03/09 Javascript
uniapp实现可以左右滑动导航栏
2020/10/21 Javascript
[02:40]DOTA2殁境神蚀者 英雄基础教程
2013/11/26 DOTA
详细介绍Python中的偏函数
2015/04/27 Python
Python多线程实现同步的四种方式
2017/05/02 Python
django反向解析URL和URL命名空间的方法
2018/06/05 Python
python socket通信编程实现文件上传代码实例
2019/12/14 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
spyder 在控制台(console)执行python文件,debug python程序方式
2020/04/20 Python
Django Path转换器自定义及正则代码实例
2020/05/29 Python
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
AJAX都有哪些有点和缺点
2012/11/03 面试题
师范学院教师自荐书
2014/01/31 职场文书
军校大学生个人的自我评价
2014/02/17 职场文书
致长跑运动员加油稿
2014/02/20 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript