Obsidian Dataview 函数参考指南:数据处理的强大工具
概述
Obsidian Dataview 提供了一系列功能强大的函数,用于在查询中对数据进行高级处理和转换。这些函数可以在数据命令(FROM 除外)中使用,用于过滤、分组数据,也可以作为 TABLE 列或 LIST 查询的附加信息,让您以全新的视角查看数据。
函数基础
函数语法
函数本质上是一种特殊的表达式,可以在任何允许使用表达式的地方调用。函数调用遵循以下格式:
函数名(参数1, 参数2)
参数本身也可以是表达式,可以是字面量、元数据字段,甚至是另一个函数调用。每个函数对参数的数据类型都有特定要求,使用时需要注意。
可选参数
在函数文档中,方括号内的参数表示是可选的,可以省略。例如 link(path, [display])
中的 display
参数就是可选的。
列表处理特性
大多数函数既可以应用于单个值(如数字、字符串、日期等),也可以应用于这些值的列表。当应用于列表时,函数会对列表中的每个元素分别执行操作,并返回一个新的列表。例如:
lower("YES") = "yes"
lower(["YES", "NO"]) = ["yes", "no"]
这种"函数向量化"特性在下文的函数定义中不会特别说明,但对大多数函数都适用。
构造函数
创建基础数据类型
-
object(key1, value1, ...)
创建一个新对象,键和值应交替提供,键必须是字符串。object("a", 6) // 创建映射"a"到6的对象
-
list(value1, value2, ...)
创建一个包含给定值的新列表,array
是其别名。list(1, 2, 3) // 创建包含1,2,3的列表
-
date(any)
从字符串、日期或链接对象解析日期。date("2020-04-18") // 解析为日期对象
-
dur(any)
解析持续时间字符串为持续时间对象。dur("8 minutes, 4 seconds") // 解析为8分4秒
-
number(string)
从字符串中提取第一个数字。number("18 years") // 返回18
类型转换函数
-
string(any)
将任何值转换为合理的字符串表示。string(dur(8 hours)) // 返回"8 hours"
-
link(path, [display])
从文件路径或名称构造链接对象。link("Hello", "Goodbye") // 创建显示为"Goodbye"的链接
-
embed(link, [embed?])
将链接对象转换为嵌入式链接(对图片支持较好)。 -
elink(url, [display])
构造外部URL链接。elink("www.google.com", "Google")
-
typeof(any)
获取对象的类型。typeof([1, 2, 3]) // 返回"array"
数值运算
基本数学运算
-
round(number, [digits])
四舍五入到指定小数位。round(16.555555, 2) // 16.56
-
trunc(number)
截断小数部分。trunc(-93.33333) // -93
-
floor(number)
向下取整。floor(-0.837764) // -1
-
ceil(number)
向上取整。ceil(-0.837764) // 0
统计函数
-
min/max(a, b, ...)
计算最小值/最大值。max("a", "ab", "abc") // "abc"
-
sum/product(array)
计算数组的和/积。product([1,2,3]) // 6
-
average(array)
计算平均值。average([1, 2]) // 1.5
-
reduce(array, operand)
通用归约函数,支持加减乘除和布尔运算。reduce([100,20,3], "-") // 77
高级统计
minby/maxby(array, function)
使用指定函数计算最小/最大值。maxby(file.tasks, (k) => k.due) // 最晚到期任务
对象、数组和字符串操作
包含检查
-
contains(object|list|string, value)
检查容器是否包含值(区分大小写)。contains("hello", "lo") // true
-
icontains()
不区分大小写的版本。 -
econtains()
精确匹配检查。econtains(["words"], "word") // false
-
containsword()
检查单词精确匹配(不区分大小写)。containsword("Hello there!", "hello") // true
数组操作
-
extract(object, key1, key2, ...)
从对象提取指定字段。extract(file, "ctime", "mtime")
-
sort/reverse(list)
排序/反转列表。sort(list(3, 2, 1)) // [1,2,3]
-
length(object|array)
获取对象字段数或数组长度。 -
nonnull(array)
移除数组中的null值。 -
filter(array, predicate)
过滤数组元素。filter([1,2,3], (x) => x >= 2) // [2,3]
-
map(array, func)
映射数组元素。map([1,2,3], (x) => x + 2) // [3,4,5]
-
flat(array, [depth])
展平嵌套数组。flat(list(1, list(2,3))) // [1,2,3]
逻辑运算
-
all(array)
检查所有元素是否为真。all([true, false]) // false
-
any(array)
检查任一元素为真。any([false, true]) // true
-
none(array)
检查无元素为真。none([false, false]) // true
字符串操作
正则表达式
-
regextest(pattern, string)
检查正则是否匹配字符串部分内容。regextest("\w+", "hello") // true
-
regexmatch(pattern, string)
检查正则是否匹配整个字符串。 -
regexreplace(string, pattern, replacement)
正则替换。regexreplace("Suite 1000", "\d+", "-") // "Suite -"
基本字符串操作
-
replace(string, pattern, replacement)
简单字符串替换。replace("The big dog", "big", "small")
-
lower/upper(string)
转换大小写。lower("TEST") // "test"
总结
Obsidian Dataview 的函数库提供了强大的数据处理能力,从简单的类型转换到复杂的统计运算,再到灵活的正则处理,几乎涵盖了知识管理中的所有数据处理需求。掌握这些函数的使用,可以大幅提升您在 Obsidian 中组织和分析数据的效率。
建议从基础构造函数和简单运算开始练习,逐步掌握更高级的函数组合使用技巧。在实际应用中,这些函数往往需要组合使用,才能发挥最大威力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考