如何在JavaScript中实现Groovy的列表列表指定索引求和功能
在JavaScript中实现Groovy列表列表求和逻辑
核心逻辑对应实现
Groovy代码value.collect { it.get(0) }*.toInteger().sum()的作用是:遍历嵌套列表,提取每个子列表第0位元素,转为整数后求和。在JavaScript中可以通过map+reduce组合实现完全等价的功能:
处理单个嵌套列表(对应Groovy中的value)
如果你的目标是处理单个列表列表(比如Groovy里的value变量),代码如下:
// 示例嵌套列表 const nestedList = [['12'], ['34'], ['56']]; // 提取第0位元素、转整数、求和 const total = nestedList .map(item => Number(item[0])) // 对应collect取索引0 + *.toInteger() .reduce((accumulator, current) => accumulator + current, 0); // 对应sum() console.log(total); // 输出:102
处理值为嵌套列表的Map
如果要遍历整个Map的所有值(每个值都是嵌套列表)并分别求和,或者汇总所有值的总和,可以这样做:
// 示例Map,值为列表列表 const dataMap = { listA: [['10'], ['20']], listB: [['30'], ['40'], ['50']] }; // 方式1:获取每个Map值的单独求和结果 const groupTotals = Object.fromEntries( Object.entries(dataMap).map(([key, nestedList]) => { const sum = nestedList .map(item => parseInt(item[0], 10)) // 用parseInt转整数,需指定基数10 .reduce((acc, curr) => acc + curr, 0); return [key, sum]; }) ); console.log(groupTotals); // 输出:{ listA: 30, listB: 120 } // 方式2:汇总所有Map值的总和 const totalAll = Object.values(dataMap) .flat() // 先把所有嵌套列表合并成一维列表 .map(item => +item[0]) // 用+号快速转整数 .reduce((acc, curr) => acc + curr, 0); console.log(totalAll); // 输出:150
细节说明
- 转整数的三种常用方式:
Number(item[0])、parseInt(item[0], 10)、+item[0],效果一致,可根据习惯选择。 reduce方法必须指定初始值0,避免空列表时返回undefined。- 如果子列表可能为空,建议加判断:
map(item => item[0] ? Number(item[0]) : 0),防止转整数时出现NaN。
内容的提问来源于stack exchange,提问作者Eric C.
相关产品推荐
相关产品推荐

