迭代数组并删除一些实体,而不是保留undefined

时间:2014-05-13 16:23:37

标签: javascript underscore.js

我想删除数组中的特定位置,并减少数组的长度,使其在删除后不包含未定义的位置。我也在迭代数组。

我可以想象一个蛮力的解决方案会在阵列上迭代两次,但我只是想我会检查一下是否有更容易的东西。

这就是我所拥有的:

_.each(foo._events, function (eventGroup) {

    var keys = _.keys(eventGroup);

    _.each(keys, function (key) {
        if (eventGroup[key].ctx.isClosed) {
            delete eventGroup[key];
            console.log("Deleting closed");
        }
    });
});

但这会在插槽中留下未定义的元素。

我正在探索这里的一些选项:How do I remove a particular element from an array in JavaScript?但我怀疑修改数组的长度,而迭代它可能会导致奇怪的行为?但也许它很好,因为我通过键访问 - 即使键看起来是“0”,“1”,“2”。

2 个答案:

答案 0 :(得分:2)

我不确定我完全理解,但也许filter正是你要找的?

foo._events = _.filter(foo._events, function (eventGroup) {
    return _.every(_.values(eventGroup), function(v) {
         return !v.ctx.isClosed
    })
})

答案 1 :(得分:0)

您是否考虑过在一个循环中向下滑动元素,而不是遍历数组两次?即,一旦找到要删除的元素的索引,就将该索引i处的值赋给索引i + 1处的值,依此类推。你是对的,在迭代时改变数组的大小是危险的,甚至不允许使用更严格的语言。完成后,在循环中重新分配元素后,可以将大小更改为N - 1。