搜索
查看: 4654|回复: 14

[其他] reduce 函数用法大全

[复制链接]

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2018-4-8 17:59:40 | 显示全部楼层 |阅读模式
用法1,数组值求和:
import console;

var arr = {1;2;3;4;5}
var value = reduce(arr, lambda(a,b) a + b );

console.dump(value);
console.pause(
true);


用法2,将数组中所有值转换为字符
import console;

var arr = {1;22;3;456}

//将数组中的所有值转换为字符串
var value = reduce(arr,function(a,b,i){
    a[ i ] =
tostring(b)
   
return a;
},{});

console.dump(value);
console.pause(
true);

用法3,筛选数组中的值
import console;

var arr = {1;22;3;456}

//筛选出所有小于100的数
var value = reduce(arr,function(a,b){
   
if( b <100) table.push(a,b);
   
return a;
},{});

console.dump(value);
console.pause(
true);

reduce 是一个经典的无循环函数,在js,python这些语言中都有相同的函数,
aardio中 reduce函数的设计,基本与js的用法规则一样,例如空数组不指定初始值报错,指定初始值不跳过第一个数组成员,不指定初始值跳过第一个数组成员(用第一个数组成员作为初始值),初始值可以是任意对象,这些规则全都一样,参数的位置用法都一样。


大家还能想到什么其他的用法呢,欢迎跟帖,也可以翻译其他语言的代码。


回复

使用道具 举报

12

主题

679

帖子

4008

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
4008
发表于 2018-4-8 18:10:33 | 显示全部楼层

如何知道一串字符串中每个字母出现的次数?


import console;
var str = "abcdaabcdkdjkdssklacczx";

var t = reduce(string.split(str), function(res, cur) {
   
if(res[cur]) res[cur] ++ else res[cur]=1
   
return res;
}, {})

console.dumpJson( t )
console.pause(
true);

点评

也可以这样写 res[cur] = ( res[[cur]] : 0) + 1  发表于 2018-4-8 18:18
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
 楼主| 发表于 2018-4-8 19:16:17 | 显示全部楼层

找出数组中最大的值

import console;

var arr = {1;22;3;456}

//找出数组中最大的值
var value = reduce(arr,function(a,b){
   
return math.max(a,b);
});

console.dump(value);
console.pause(
true);

回复

使用道具 举报

4

主题

63

帖子

485

积分

二级会员

Rank: 3Rank: 3

积分
485
发表于 2018-4-8 20:47:22 | 显示全部楼层
本帖最后由 我心飞翔1995 于 2018-4-8 20:48 编辑

实现map函数

类似于python的map函数,使用reduce实现,加入了简单的有效性判断,请各位高手帮忙完善,争取加入标准库或者内建函数。

  1. //利用reduce函数实现map函数

  2. import console;

  3. //map函数
  4. var map=function(arr,func){
  5.     reduce(arr,function(prev,next,index,arr){
  6.                 arr[index]=func(arr[index]);
  7.                 return ;
  8.         },{arr[1]});
  9.         if(func(arr[1])!==null){
  10.                  return  arr;
  11.                  }
  12.         else{
  13.                 return error("处理函数无返回值");
  14.                 }
  15. }

  16. var a = {0;4;6;8;10;12};//测试数据

  17. //用于测试的处理函数
  18. var test=function(a){
  19.     return a/2;       
  20. }

  21. var ret=map(a,test);//结果数据

  22. console.dump(ret);//打印结果
  23. console.pause();
复制代码
回复

使用道具 举报

12

主题

679

帖子

4008

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
4008
发表于 2018-4-8 21:15:38 | 显示全部楼层
我心飞翔1995 发表于 2018-4-8 20:47
实现map函数

类似于python的map函数,使用reduce实现,加入了简单的有效性判断,请各位高手帮忙完善,争 ...

map 不是只对当前值做处理吗

import console;

table.map =
function(tab,proc){
   
var t = {};
   
for(i=1;#tab){
        t[ i ] = proc(tab[ i ], i, tab)
    }
   
return t;  
}

var a = {0;4;6;8;10;12};//测试数据

//用于测试的处理函数
var test = function(a){
   
return a/2;      
}

var ret = table.map(a,test);//结果数据

console.dump(ret);
//打印结果
console.pause();

点评

同意: 5.0 真棒: 5.0
同意: 5 真棒: 5
疏忽了,果然是学的还不够。 看到的几个数组的例子就想到了Python的map函数,多谢,学到了  发表于 2018-4-8 21:47
回复

使用道具 举报

12

主题

679

帖子

4008

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
4008
发表于 2018-4-9 08:55:17 | 显示全部楼层
import console;

table.join =
function(arr,s){
   
if(!s) s = ","
   
return reduce(arr,function(prev,next){
        
return prev ++ s ++ next
    });
}

var arr = {0;4;6;8;10;12};//测试数据

console.log( table.join(arr,
"-") ) //0-4-6-8-10-12

//通过join()方法可以实现重复字符串,只需传入字符串以及重复的次数,
//就能返回重复后的字符串,函数如下:

repeatString =
function(str, n) {
   
return table.join(table.array((n>0?n:0)+1,""),str)
}

console.log(repeatString(
"abc", 3)); // abcabcabc
console.pause(true);

回复

使用道具 举报

12

主题

679

帖子

4008

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
4008
发表于 2018-4-9 09:46:52 | 显示全部楼层
我心飞翔1995 发表于 2018-4-8 20:47
实现map函数

类似于python的map函数,使用reduce实现,加入了简单的有效性判断,请各位高手帮忙完善,争 ...


其实可以用reduce函数 直接达到map的效果!

import console;
var arr = {0;4;6;8;10;12};//测试数据

var ret = reduce(arr,function(res, cur, idx){
    res[idx] = cur/2;
   
return res;
},{})

console.dumpJson(ret);
//打印结果
console.pause();
回复

使用道具 举报

4

主题

63

帖子

485

积分

二级会员

Rank: 3Rank: 3

积分
485
发表于 2018-4-9 10:05:20 | 显示全部楼层
xauto 发表于 2018-4-9 08:55
import console;

table.join = function(arr,s){

重复字符串的函数很不错,也很常用,不过有点美中不足,我稍微改进了一下,加入可选参数分隔符,同时可以通过传入第五个参数决定分隔符是外包还是内插。


  1. import console;

  2. table.join = function(arr,s){
  3.     if(!s) s = "";
  4.     return reduce(arr,function(prev,next){
  5.         return prev ++ s ++ next;
  6.     });
  7. }

  8. var arr = {0;4;6;8;10;12};//测试数据

  9. console.log( table.join(arr,"-") ); //0-4-6-8-10-12

  10. //通过join()方法可以实现重复字符串,只需传入字符串以及重复的次数,
  11. //就能返回重复后的字符串,函数如下:

  12. repeatString = function(str, n,split="",isout=false) {//分隔符参数可选,是否外包参数可选
  13.         if(isout){
  14.                 return table.join(table.array((n>0?n:0)+1,split),str);
  15.                 }
  16.         else{
  17.             return table.join(table.array((n>0?n:0),str),split);
  18.             }
  19. }

  20. console.log(repeatString("abc", 3,"-",false)); // abcabcabc
  21. console.pause(true);
复制代码

回复

使用道具 举报

12

主题

679

帖子

4008

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
4008
发表于 2018-4-9 10:49:25 | 显示全部楼层
import console;

//array.some()
//判断数组中是否存在满足条件的项,只要有一项满足条件,就会返回true。
var arr = {1; 2; 3; 4; 5};

var ret = reduce(arr,function(prev,next){
   
return next >= 3 || prev;
},
false);

console.log( ret )
//true

//array.every()
//判断数组中每一项都是否满足条件,只有所有项都满足条件,才会返回true。
var ret = reduce(arr,function(prev,next){
   
return next >= 3 && prev;
},
true);

console.log( ret )
//false

console.pause(
true);
回复

使用道具 举报

12

主题

679

帖子

4008

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
4008
发表于 2018-4-9 13:06:45 | 显示全部楼层
实际应用:listvive 筛选

import win.ui;
/*DSG{{*/
var winform = win.form(text="筛选";right=290;bottom=255)
winform.add(
edit={cls=
"edit";left=27;top=29;right=245;bottom=58;edge=1;multiline=1;z=1};
listview={cls=
"listview";left=27;top=60;right=245;bottom=192;edge=1;z=2}
)
/*}}*/

var name = {"赵三";"张三";"李四";"孙李";"张三丰";"李四光";};
winform.listview.insertColumn(
"姓名",100)
winform.listview.items = name;
winform.edit.oncommand =
function(id,event){
   
if(event = 0x400/*_EN_UPDATE*/){
        winform.listview.items =
reduce(name,function(prev,next){
            
var f = string.indexOf(next,winform.edit.text)
            
if(f) table.push(prev,next)
            
return prev;
        },{})
    }
}
winform.show()
win.loopMessage();

回复

使用道具 举报

0

主题

24

帖子

168

积分

一级会员

Rank: 2

积分
168
发表于 2018-4-9 17:47:17 | 显示全部楼层
传说中的map reduce,函数式编程最基本的两个函数。用起来比较方便。
回复

使用道具 举报

3

主题

5

帖子

49

积分

培训班

积分
49
发表于 2018-7-29 10:13:59 | 显示全部楼层
文本属性列表转table

import console;

var str = /*
产品:加裕智倍保
年期:18
年龄:0
保额:100000
性别:女
基本保单的首年保费:1183.00
*/

var contents = string.splitEx(str,"\r\n");
var info = reduce(contents,function(prev,next,index,aar){
    s = string.splitEx(aar[index],"\:")
        prev[s[1]] = s[2];
        return prev
},{})

console.dump(info);//打印结果
console.pause();
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
 楼主| 发表于 2018-7-29 12:19:05 | 显示全部楼层
veluxa 发表于 2018-7-29 10:13
文本属性列表转table

import console;
import console;

var str = /*
产品:加裕智倍保
年期:18
年龄:0
保额:100000
性别:女
基本保单的首年保费:1183.00
*/


var contents = string.splitEx(str,"\r\n");
var info = reduce(contents,function(arr,value){
    s = string.splitEx(value,
"\:")
    arr[ s[1] ] = s[2];
   
return arr
},{})

console.dump(info);
//打印结果
console.pause();
也可以这样写:
import console;
import string.list;

var str = /*
产品:加裕智倍保
年期:18
年龄:0
保额:100000
性别:女
基本保单的首年保费:1183.00
*/


var info = string.list(str,,":");
console.dumpJson(info)
console.pause();


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-12-15 14:22 , Processed in 0.078125 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表