javascript - 我可以在 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], keyPath, 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, keyPath, value);
console.log("doc after:\n" + JSON.stringify(doc, undefined, 3));
我并不声称上述代码是最佳的,但它确实可以完成工作。
推荐阅读
- qt - 如何使用密码模式为 Qlineedit 设置 QFont
- apache-spark - 从 Spark 列中提取单词
- python-3.x - 为什么组合框显示在每一帧中,而不是只显示在它写入的帧中?
- java - 使用 Maven 编译成 WAR 时包含非 java 文件
- spring - @Autowire 存储库适用于 Application 但在 JUnitTest 中失败
- python - pandas datframe中单独的数值和分类变量
- django - 如何查询数据以显示在图表中
- java - Spring Boot Starter Web Dependency 给出缺少工件的错误
- swift - NavigationBar 和 TableView 之间的额外空间
- python - TypeError:将形状转换为 TensorShape 时出错:只接受大小为 1 的数组