繁体   English   中英

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

[英]Underscore.js .filter() and .any()

我有一个称为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属性的结果的市场。 我想剔除那些没有的。

使用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属性的结果,所有空白的市场和所有空白的events

下划线版本可能如下所示:

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;
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM