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 相关文章推荐
Some tips of wmi scripting in jscript (1)
Apr 03 Javascript
基于jquery的button默认enter事件(回车事件)。
May 18 Javascript
javascript实现复制与粘贴操作实例
Oct 16 Javascript
JavaScript学习笔记之基础语法
Jan 22 Javascript
JS实现自定义简单网页软键盘效果代码
Nov 05 Javascript
基于JavaScript实现一定时间后去执行一个函数
Dec 14 Javascript
js按条件生成随机json:randomjson实现方法
Apr 07 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
Jun 14 Javascript
详解React之父子组件传递和其它一些要点
Jun 25 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
Sep 28 Javascript
javascriptvoid(0)含义以及与&quot;#&quot;的区别讲解
Jan 19 Javascript
Vue触发隐藏input file的方法实例详解
Aug 14 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实现WEB动态网页静态
2006/10/09 PHP
dedecms模版制作使用方法
2007/04/03 PHP
站长助手-网站web在线管理程序 v1.0 下载
2007/05/12 PHP
php入门学习知识点一 PHP与MYSql连接与查询
2011/07/14 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
PHP的全局错误处理详解
2016/04/25 PHP
Javascript 多浏览器兼容总结(实战经验)
2013/10/30 Javascript
浅析jQuery Mobile的初始化事件
2015/12/03 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
微信小程序搜索组件wxSearch实例详解
2017/06/08 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
Vue.js中的computed工作原理
2018/03/22 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
2018/08/31 Javascript
vue如何解决循环引用组件报错的问题
2018/09/22 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
vue.js封装switch开关组件的操作
2020/10/26 Javascript
Python中用altzone()方法处理时区的教程
2015/05/22 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
2017/01/20 Python
Python简单实现Base64编码和解码的方法
2017/04/29 Python
深入了解Python iter() 方法的用法
2019/07/11 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
HTML5 拖放功能实现代码
2016/07/14 HTML / CSS
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
香港演唱会订票网站:StubHub香港
2019/10/10 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
医学类个人求职信范文
2014/02/05 职场文书
电大本科自我鉴定
2014/02/05 职场文书
新闻报道策划方案
2014/06/11 职场文书
租房协议书范文
2014/08/20 职场文书
2014年设计师工作总结
2014/11/25 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
思想政治表现评语
2015/01/04 职场文书
食品安全主题班会
2015/08/13 职场文书
幼儿园体操比赛口号
2015/12/25 职场文书
Python中使用subprocess库创建附加进程
2021/05/11 Python
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python