我可以在单个循环中使用dojo.forEach删除商店中的对象吗?

时间:2015-02-05 19:25:12

标签: arrays foreach dojo store

我想循环浏览商店中的对象,如果它们不符合某些条件则将其删除,例如:

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数组上第二次循环以删除对象,而不是在商店数据本身上循环。它可以工作,但我必须循环两次来做这样的事情吗?

由于

1 个答案:

答案 0 :(得分:0)

简答

改为使用store.query().forEach(...)

长答案

store.datadojo/store/Memory内部用于存储和处理商店中数据的属性。它特定于Memory存储实现,通常不应直接迭代,特别是在这些情况下,因为store.remove将元素拼接出这个数组,并迭代数组作为其元素拼接出来本身就会产生有趣的不良影响:

  • 使用ES5的Array#forEach,每次删除相同或更低索引的循环时,循环都会跳过一个项目,因为它会顺序通过数组索引,而不会怀疑项目是从它下面拼接出来的。< / LI>
  • 使用dojo/_base/array.forEach,您会收到项目跳过行为错误,因为dojo/_base/array中的函数首先缓存数组的长度,然后继续前进,而不是期待那个要改变的数字。

另一方面,对于要从商店中迭代数据的用例,store.query() 意图。它返回的QueryResults对象甚至提供forEachmap个函数,无论您是否在ES5就绪浏览器中,都可以使用它们,无论是否您的商店甚至是同步的(一旦检索到异步商店的结果,它将异步运行)。但最重要的是,它在Memory的情况下返回自己的数组,因此您不必处理从您下面拼接出来的数组元素。

可运行的示例:http://jsfiddle.net/eu6aqxbq/