Underscore.js .filter() 和 .any()

5
我有一个名为eventsevent对象数组。每个event都有markets,它包含market对象的数组。在这里还有另一个名为outcomes的数组,其中包含outcome对象。

这个问题中,我询问了一种[Underscore.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.outcomes仅存储等于bar的结果。目前,这只是给我一些具有某些设置的test属性的结果。我想剔除不需要的。


它真的很好用吗?你内部的.any()回调引用了“outcome”,但参数是“outc”... - Pointy
另外,似乎你只需要将.any()改为.all()并使用相反的条件。换句话说,从“任何一个是…”变为“所有不是…” - Pointy
你能给个例子吗?我不确定你所说的“相反条件”是什么意思。 - user1082754
你想从事件/市场数组中删除它们,还是想创建一个包含这些结果的新结构? - Bergi
事件应仅包含具有测试属性的市场。结果应仅包含具有测试属性的结果。如果结果数组中没有test属性,我想将其从中删除。 - user1082754
显示剩余2条评论
1个回答

5

使用splice方法对数组进行删除,将其制作成简单循环:

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
}

这段代码将从“events”数组中删除所有没有“test”属性的结果,所有空市场和所有空事件。
Underscore版本可能看起来像这样:
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;
});

太棒了,谢谢。不过,使用Underscore库是否可以实现这个(因为我已经在其他地方使用该库,代码可能会更易读)。 - user1082754
是的,这是可能的。但下划线过滤函数会创建新的数组实例,然后覆盖旧的数组,而不仅仅是从它们中删除项目。 - Bergi
@Kloar:它可能是所需的,也可能不是,差别可能很大。 - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接