我正在使用Zod来验证我的申请表的输入,当验证错误发生时,我会收到一组带有message
属性和path
属性的错误。
我需要将接收到的path
属性转换为string
对象路径,以便使用它为React Final Form创建ValidationError
给定path
:
["user", "name"]
["company", 0, "name"]
预期的string
对象路径:
"user.name"
"company[0].name"
令人惊讶的是,我在Stack Overflow、Google Search或NPM上没有发现任何实现此功能的代码:(
快速尝试:
const string_path = (path) =>
path.reduce(
(acc, item) => acc + (Number.isInteger(item) ? '[' + item + ']' : '.' + item),
''
).substring(1);
console.log(string_path(["user", "name"]));
console.log(string_path(["company", 0, "name"]));
编辑:所以,从@vich的帖子中,我了解到reduce会很乐意使用数组的第一个元素作为累加器,如果你没有指定的话,所以这里有一个稍微短一点的版本:
const string_path = (path) =>
path.reduce(
(acc, item) => acc + (Number.isInteger(item) ? '[' + item + ']' : '.' + item)
);
console.log(string_path(["user", "name"]));
console.log(string_path(["company", 0, "name"]));
console.log(string_path(["user"]));
您可以使用Array.reduce
来实现您想要的。
const paths = ["company", 0, "name"];
const result = paths.reduce((acc, item) => {
return typeof item === "string" ?
acc + "." + item :
`${acc}[${item}]`
}, "");
console.log(result.slice(1));
这很琐碎。值得你自己尝试。
["user", "name"].reduce((string, item) => (typeof item === "number") ? string + "[" + item + "]" : string + "." + item)
"user.name";
["company", 0, "name"].reduce((string, item) => (typeof item === "number") ? string + "[" + item + "]" : string + "." + item)
"company[0].name";