如何解决我可以在 pouchdb upsert 中将变量作为键传递吗
我想在使用 pouchdb 的插件 upsert 时传入用户定义的变量。理想情况下,是这样的:
var res = db.upsert(uniqueID,(doc) => {
doc.data.var1.var2.var3 = userInput
}
我的尝试:
var res = db.upsert(uniqueID,(doc) => {
doc.data = {[var1]:
{[var2]:
{[var3]: userInput}
}
}
}
这会导致 doc.data
的内容被每个新变量重复覆盖。
现在,有没有一种方法可以简单地定义我打算向上插入的嵌套的、依赖于变量的键?
每个 var3: userInput
的文档似乎过于庞大。
解决方法
Javascript 中不存在“如果键不存在则使其值成为对象”的行为。例如如果 doc = {}
那么
doc.data.foo.bar = "fail"
将始终失败,因为 data
未定义。
相反,可以定义一个简单的函数来提供此类功能。
function setDeepValue(target,keyPath,value) {
const key = keyPath.shift();
if (key !== undefined) {
// there is more work to be done.
if (keyPath.length === 0) {
// we're at the end of the path,assign key to value
target[key] = value;
} else {
if (target[key] === undefined) {
// create an object for the key
target[key] = {};
}
// keep going.
setDeepValue(target[key],value);
}
}
}
//
// demo the function
//
const doc = {};
let var1 = "key1",var2 = "key2",var3 = "key3";
const keyPath = ["data",var1,var2,var3];
const value = "My Value";
console.log("doc before:\n" + JSON.stringify(doc,undefined,3));
setDeepValue(doc,value);
console.log("doc after:\n" + JSON.stringify(doc,3));
我不认为上面的代码是最佳的,但它确实可以。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。