我想循环浏览商店中的对象,如果它们不符合某些条件则将其删除,例如:
this.myStore = new Observable(new Memory({identifier: "id", data: []}));
...
array.forEach(this.myStore.data, lang.hitch(this, function(foo){
if (foo.status === Status.REMOVE){
this.myStore.remove(foo.id);
}
else{
this.myStore.get(foo.id).status = Status.NONE;
}
}));
但是,只要删除商店中的单个对象,foo对象就会在下一个循环中变为未定义。
这应该是可能的,还是错误的做法?
我找到的解决方法是首先循环查找要删除的对象的id,并将它们存储在数组中。然后我在这个id数组上第二次循环以删除对象,而不是在商店数据本身上循环。它可以工作,但我必须循环两次来做这样的事情吗?
由于
答案 0 :(得分:0)
改为使用store.query().forEach(...)
。
store.data
是dojo/store/Memory
内部用于存储和处理商店中数据的属性。它特定于Memory
存储实现,通常不应直接迭代,特别是在这些情况下,因为store.remove
将元素拼接出这个数组,并迭代数组作为其元素拼接出来本身就会产生有趣的不良影响:
Array#forEach
,每次删除相同或更低索引的循环时,循环都会跳过一个项目,因为它会顺序通过数组索引,而不会怀疑项目是从它下面拼接出来的。< / LI>
dojo/_base/array.forEach
,您会收到项目跳过行为和错误,因为dojo/_base/array
中的函数首先缓存数组的长度,然后继续前进,而不是期待那个要改变的数字。另一方面,对于要从商店中迭代数据的用例,store.query()
意图。它返回的QueryResults
对象甚至提供forEach
和map
个函数,无论您是否在ES5就绪浏览器和中,都可以使用它们,无论是否您的商店甚至是同步的(一旦检索到异步商店的结果,它将异步运行)。但最重要的是,它在Memory
的情况下返回自己的数组,因此您不必处理从您下面拼接出来的数组元素。