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脚本语言在网页中的简单应用
May 13 Javascript
JS 自动安装exe程序
Nov 30 Javascript
jQuery 动画弹出窗体支持多种展现方式
Apr 29 Javascript
浅析js封装和作用域
Jul 09 Javascript
jQuery 中DOM 操作详解
Jan 13 Javascript
使用CoffeeScrip优美方式编写javascript代码
Oct 28 Javascript
Bootstrap表单简单实现代码
Mar 06 Javascript
vue2.0实战之基础入门(1)
Mar 27 Javascript
解决vue-router中的query动态传参问题
Mar 20 Javascript
JavaScript之实现一个简单的Vue示例
Jan 17 Javascript
vue 子组件watch监听不到prop的解决
Aug 09 Javascript
vue3.0实现插件封装
Dec 14 Vue.js
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为SHOPEX增加日志功能代码
2010/07/02 PHP
深入php socket的讲解与实例分析
2013/06/13 PHP
php验证邮箱和ip地址最简单方法汇总
2015/10/30 PHP
判断脚本加载是否完成的方法
2009/05/26 Javascript
javascript 全角转换实现代码
2009/07/17 Javascript
web css实现整站样式互相切换
2013/10/29 Javascript
jquery无刷新验证邮箱地址实现实例
2014/02/19 Javascript
jQuery解析返回的xml和json方法详解
2017/01/05 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
javascript高仿热血传奇游戏实现代码
2018/02/22 Javascript
elementui的默认样式修改方法
2018/02/23 Javascript
nodejs前端模板引擎swig入门详解
2018/05/15 NodeJs
详解AngularJS 过滤器的使用
2018/06/02 Javascript
Vue.use源码学习小结
2018/06/20 Javascript
Vue-不允许嵌套式的渲染方法
2018/09/13 Javascript
vue+element-ui+axios实现图片上传
2019/08/20 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
2020/11/12 Javascript
Python字符编码判断方法分析
2016/07/01 Python
python直接访问私有属性的简单方法
2016/07/25 Python
名片管理系统python版
2018/01/11 Python
pandas实现将dataframe满足某一条件的值选出
2019/06/12 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
Python字典推导式将cookie字符串转化为字典解析
2019/08/10 Python
Python数据分析模块pandas用法详解
2019/09/04 Python
Django模型中字段属性choice使用说明
2020/03/30 Python
什么是Python中的顺序表
2020/06/02 Python
Python  Asyncio模块实现的生产消费者模型的方法
2021/03/01 Python
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
入党积极分子思想汇报范文
2014/01/05 职场文书
二手书店创业计划书
2014/01/16 职场文书
互联网创业计划书的书写步骤
2014/01/28 职场文书
中学生秋季运动会广播稿
2014/09/21 职场文书
宝宝满月祝酒词
2015/08/10 职场文书
深入理解以DEBUG方式线程的底层运行原理
2021/06/21 Java/Android
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android