如何更新数组作用域变量中的值



我有一个存储存档的作用域变量:

viewScope.MY_SCOPE = new Array();
viewScope.MY_SCOPE.push(["id0", 0, true]);
viewScope.MY_SCOPE.push(["id1", 1, false]);
viewScope.MY_SCOPE.push(["id2", 3, true]);

现在我想更新item中的一个。

viewScope.MY_SCOPE[1][2] = "true";

失败,报错:

执行JavaScript动作表达式put(int index,FBSValue value)时出错,JavaWrapperObject不支持。

如何更新数组中的特定项?

将SSJS数组对象添加到作用域时,它被转换为java.util.Vector。因此,如果您想设置该值,您应该使用

viewScope.MY_SCOPE[1].set(2,"true");

代替viewScope.MY_SCOPE[1][2] = "true";

我认为问题是使用...[2] = "true"试图执行给定对象的put方法。虽然put在HashMaps或作用域映射等map中可用,但Vectors使用set而不是put来更改值。因此,您会得到"不支持操作表达式put(…)"错误。与此相反,使用viewScope.MY_SCOPE[1][2]获取变量没有问题,因为get方法在HashMaps和Vectors中都可用。

在范围变量中存储数组时,我喜欢将值放入类型正确的javascript变量中,进行编辑,然后用更新后的值替换范围变量。

在你的情况下,我会这样做:

var tempVar = viewScope.MY_SCOPE.toArray();  //convert to array to make sure properly typed
tempVar[1][2] = true;
viewScope.put(MY_SCOPE,tempVar);

更新:在测试了您的代码和我的代码之后,我也得到了相同的错误。老实说,我从一开始就不会把多维数组搞砸。这是使用对象数组的绝佳机会:

var tempVar = [];  // initialize the array
tempVar.push({val1:"id0",val2:0,val3:true});
tempVar.push({val1:"id1",val2:1,val3:false});
tempVar.push({val1:"id2",val2:3,val3:true});
viewScope.put("MY_SCOPE",tempVar);

然后更改所需值:

var tempVar = [];
tempVar = viewScope.get("MY_SCOPE");
tempVar[1].val3 = true;
viewScope.put("MY_SCOPE",tempVar)

最新更新