1

我有一个由我的脚本创建的对象数组,我试图将该数组复制到一个新数组中,然后使用以下函数将其存储在 scriptDb 中:

function copyAndStore (currentArray) {
  var db = ScriptDb.getMyDb();
  var copyArray = [];
  for (var i in currentArray) {
    copyArray.push(currentArray[i]);
  }
  var id = db.save(copyArray);
  return id;
}

它正确复制了所有内容,但是当它到达时,var id = db.save(copyArray);我得到了错误:Invalid argument. Expected a javascript map object.

ScriptDb 是否存在存储数组的问题?在此先感谢您的帮助。

4

2 回答 2

6

正如@Thomas 所说,您可以将数组保存在地图对象中。

在将对象放入 ScriptDB 之前,您也不需要执行复制操作。您可以简单地保存数组db.save({myArray}),并记住 ID。

这是一些要演示的极简代码。我展示了两种检索您保存的数组的方法 - 一种通过 ID,这似乎是您计划的方式,但也是使用“键”值进行查询的第二种方式。如果您希望在以后的代码运行中检索 ScriptDB 的内容,则这种方法无需以某种方式记住存储数组的 ID。

function saveArray (currentArray) {
  var db = ScriptDb.getMyDb();
  return db.save({type: "savedArray", data:currentArray}).getId();
}

function loadArrayById (id) {
  var db = ScriptDb.getMyDb();
  return db.load(id).data;
}

function loadArrayByType () {
  var db = ScriptDb.getMyDb();
  var result = db.query({type: "savedArray"});
  if (result.hasNext()) {
    return result.next().data;
  }
  else {
    return [];
  }
}

function test() {
  var arr = ['this','is','a','test'];
  var savedId = saveArray( arr );
  var loaded1 = loadArrayById( savedId );
  var loaded2 = loadArrayByType();
  debugger;  // pause if running debugger
}

这是您在调试器暂停时看到的内容:

调试器截图

请注意,通过使用 map 标记data从保存的对象中提取数组,两者loaded1loaded2都与源数组相同arr

于 2013-02-23T00:37:32.817 回答
1

ScriptDb只存储地图对象。但是,您可以存储包含数组的地图!

您可以使用数组在一次调用中保存多个对象,使用db.saveBatch.

于 2013-02-22T21:58:39.783 回答