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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10824091/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-24 03:04:53  来源:igfitidea点击:

Underscore.js .filter() and .any()

javascriptunderscore.js

提问by

I have an array of eventobjects called events. Each eventhas markets, an array containing marketobjects. Inside here there is another array called outcomes, containing outcomeobjects.

我有一个event名为events. 每个event都有markets,一个包含market对象的数组。里面还有另一个数组叫做outcomes,包含outcome对象。

In this question, I asked for a [Underscore.js] way to find all of the events which have markets which have outcomes which have a property named test. The answer was:

这个问题中,我要求使用 [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";
        });
    });
});

This works great, but I'm wondering how I would alter it if I wanted to filter the outcomes for each market, so that market.outcomesonly stored outcomes that were equal to bar. Currently, this is just giving me markets which have outcomes which have someset testproperties. I want to strip out the ones that do not.

这很好用,但我想知道如果我想过滤每个市场的结果,我将如何改变它,以便market.outcomes只存储等于bar. 目前,这只是给了我具有某些设定test属性的结果的市场。我想去掉那些没有的。

回答by Bergi

Make it a simple loop, using the splice methodfor the array removals:

使用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
}

This code will remove all outcomes that have no testproperty, all empty markets and all empty events from the eventsarray.

此代码将从数组中删除所有没有test属性的结果、所有空市场和所有空事件events

An Underscore version might look like that:

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