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 相关文章推荐
window.showModalDialog使用手册
Jan 11 Javascript
JS事件Event元素(兼容IE,Firefox,Chorme)
Nov 01 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
Jun 09 Javascript
yepnope.js使用详解及示例分享
Jun 23 Javascript
Javascript复制实例详解
Jan 28 Javascript
JQuery+EasyUI轻松实现步骤条效果
Feb 22 Javascript
yarn的使用与升级Node.js的方法详解
Jun 04 Javascript
Vue组件开发技巧总结
Mar 04 Javascript
IE11下处理Promise及Vue的单项数据流问题
Jul 24 Javascript
layui点击左侧导航栏,实现不刷新整个页面,只刷新局部的方法
Sep 25 Javascript
JS实现网站吸顶条
Jan 08 Javascript
你知道JavaScript Symbol类型怎么用吗
Jan 08 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 strstr 函数判断字符串是否否存在的实例代码
2013/09/28 PHP
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
javascript 基础篇3 类,回调函数,内置对象,事件处理
2012/03/14 Javascript
jquery封装的对话框简单实现
2013/07/21 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
JavaScript用Number方法实现string转int
2014/05/13 Javascript
jquery中each遍历对象和数组示例
2014/08/05 Javascript
jQuery插件kinMaxShow扩展效果用法实例
2015/05/04 Javascript
jquery判断当前浏览器的实现代码
2015/11/07 Javascript
JavaScript利用HTML DOM进行文档操作的方法
2016/03/28 Javascript
Nodejs从有门道无门菜鸟起飞必看教程
2016/07/20 NodeJs
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
jquery实现用户登陆界面(示例讲解)
2017/09/06 jQuery
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
vue+elementUI实现图片上传功能
2019/08/20 Javascript
JS中封装axios来管控api的2种方式
2019/09/11 Javascript
微信小程序wx.navigateTo方法里的events参数使用详情及场景
2020/01/07 Javascript
让python同时兼容python2和python3的8个技巧分享
2014/07/11 Python
Python部署web开发程序的几种方法
2017/05/05 Python
python利用百度AI实现文字识别功能
2018/11/27 Python
详解python 破解网站反爬虫的两种简单方法
2020/02/09 Python
Django-simple-captcha验证码包使用方法详解
2020/11/28 Python
20行代码教你用python给证件照换底色的方法示例
2021/02/05 Python
css3实现多个元素依次显示效果
2017/12/12 HTML / CSS
美国最大的骑马用品零售商:HorseLoverZ
2017/01/12 全球购物
美国领先的在线邮轮旅游公司:CruiseDirect
2018/06/07 全球购物
同程旅游英文网站:LY.com
2018/11/13 全球购物
Allen Edmonds官方网站:一家美国优质男士鞋类及配饰制造商
2019/03/12 全球购物
财务会计毕业生个人求职信
2014/02/03 职场文书
社区庆中秋节活动方案
2014/02/07 职场文书
导游欢迎词范文
2015/01/23 职场文书
保安辞职信范文
2015/02/28 职场文书
七年级语文教学反思
2016/03/03 职场文书
Python OpenCV之常用滤波器使用详解
2022/04/07 Python