Javascript 下划线.js.filter()和.any()

Javascript 下划线.js.filter()和.any(),javascript,underscore.js,Javascript,Underscore.js,我有一个名为events的event对象数组。每个事件都有市场,一个包含市场对象的数组。在这里有另一个名为结果的数组,包含结果对象 在中,我要求提供一种[underline.js]方法来查找所有具有市场的事件,这些市场具有名为test的属性。答案是: // filter where condition is true _.filter(events, function(evt) { // return true where condition is true for any marke

我有一个名为
events
event
对象数组。每个
事件
都有
市场
,一个包含
市场
对象的数组。在这里有另一个名为
结果
的数组,包含
结果
对象

在中,我要求提供一种[underline.js]方法来查找所有具有市场的事件,这些市场具有名为
test
的属性。答案是:

// filter where condition is true
_.filter(events, function(evt) {

    // return true where condition is true for any market
    return _.any(evt.markets, function(mkt) {

        // return true where any outcome has a "test" property defined
        return _.any(mkt.outcomes, function(outc) {
            return outc.test !== "undefined" && outc.test !== "bar";
        });
    });
});

这很有效,但我想知道如果我想过滤每个市场的结果,我会如何修改它,以便
market.outcouts
只存储等于
条的结果。目前,这只是给了我一些市场,这些市场的结果具有一些设置
测试
属性。我想去掉那些不需要的循环。

使用用于阵列移除的:

var events = [{markets:[{outcomes:[{test:x},...]},...]},...];
for (var i=0; i<events.length; i++) {
    var mrks = events[i].markets;
    for (var j=0; j<mrks.length; j++) {
        var otcs = mrks[j].outcomes;
        for (var k=0; k<otcs.length; k++) {
            if (! ("test" in otcs[k]))
                 otcs.splice(k--, 1); // remove the outcome from the array
        }
        if (otcs.length == 0)
            mrks.splice(j--, 1); // remove the market from the array
    }
    if (mrks.length == 0)
        events.splice(i--, 1); // remove the event from the array
}

它真的很棒吗?您最内部的
.any()
回调引用“output”,但参数是“outc”……除此之外,您似乎只需要使用相反的条件从
.any()
切换到
.all()
。换句话说,从“任何是…”转到“所有不是…”你能举个例子吗?不确定“相反条件”是什么意思。是否要将其从事件/市场阵列中删除,还是要创建包含这些结果的新结构?事件应仅包含具有测试属性的结果的市场。结果应仅包含具有测试属性的结果。如果结果数组没有
test
属性,我想将它们从结果数组中删除。太棒了,谢谢。然而,这可以通过下划线实现(因为我已经在其他地方使用了这个库,代码的可读性可能会更高)。但是下划线过滤器函数会创建新的数组实例,然后这些实例将覆盖过时的数组,而不仅仅是从中删除项。@Kloar:这可能是所需要的,也可能不是所需要的,差别可能很大。
events = _.filter(events, function(evt) {
    evt.markets = _.filter(evt.markets, function(mkt) {
        mkt.outcomes = _.filter(mkt.outcomes, function(otc) {
            return "test" in otc;
        });
        return mkt.outcomes.length > 0;
    });
    return evt.markets.length > 0;
});