我有一个存储存档的作用域变量:
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)