首页 > 解决方案 > 我可以在 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似乎都太过分了。

标签: javascriptarraysdatabasepouchdbupsert

解决方案


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));

我并不声称上述代码是最佳的,但它确实可以完成工作。


推荐阅读