使用Arquero按范围规则重格式化值的最佳实践及实现方法
使用Arquero根据范围规则格式化数值的最佳实践
针对你的需求,这里提供两种直观的实现方式,解决无法传递外部格式规则的问题:
方法1:利用op.case构建条件分支
这种方式直接使用Arquero内置的条件判断函数,把范围规则转换成对应的条件分支,适合规则数量不多的场景:
import * as aq from 'arquero'; const agefmt = [ { 'fmtname': 'agefmt', 'type' : 'n', 'format': [ {'start': 0, 'end': 10, 'label': '0 - 10'}, {'start': 11, 'end': 20, 'label': '11 - 20'}, {'start': 21, 'end': 30, 'label': '21 - 30'}, {'start': 31, 'end': 40, 'label': '31 - 40'}, {'start': 41, 'end': 50, 'label': '41 - 50'}, {'start': 51, 'end': 1000, 'label': '>51'} ] }, ]; const age = [ { "AGE": 19 }, { "AGE": 20 }, { "AGE": 31 }, { "AGE": 26 }, { "AGE": 46 }, { "AGE": 27 } ]; // 将原始数据转为Arquero表 const ageTable = aq.from(age); // 提取格式化规则 const formatRules = agefmt[0].format; // 构建条件分支实现映射 const result = ageTable.derive({ AGE: d => op.case( // 遍历规则生成条件-结果对 ...formatRules.map(rule => [ op.and(op.gte(d.AGE, rule.start), op.lte(d.AGE, rule.end)), rule.label ]), // 可选:处理不在任何范围内的默认值 '未知' ) }).objects(); console.log(result);
方法2:预编译映射函数
如果规则较多或需要复用格式化逻辑,可以提前编写一个映射函数,直接在derive中调用,这种方式更灵活:
import * as aq from 'arquero'; // 定义生成范围映射函数的工具函数 function createRangeMapper(rules) { return function(value) { // 查找匹配的范围规则 const matchedRule = rules.find(rule => value >= rule.start && value <= rule.end); // 返回对应标签或默认值 return matchedRule ? matchedRule.label : '未知'; }; } // 生成年龄格式化函数 const ageFormatter = createRangeMapper(agefmt[0].format); // 应用格式化到数据表 const result = aq.from(age) .derive({ AGE: d => ageFormatter(d.AGE) }) .objects(); console.log(result);
关于你之前的问题
你尝试用addFunction注册自定义函数但无法传递agefmt,是因为Arquero注册的全局函数运行在独立的表达式上下文,无法直接访问外部变量。上面两种方法都避开了这个限制,直接在derive的回调中使用可以访问外部变量的普通函数,或者用Arquero内置的条件语法实现。
内容的提问来源于stack exchange,提问作者user5072412
相关产品推荐
相关产品推荐

