Фильтрация через многомерный массив с использованием underscore.js

У меня есть массивevent объекты называютсяevents, каждыйevent имеетmarketsмассив, содержащийmarket объекты. Внутри здесь есть еще один массив под названиемoutcomes, содержащийoutcome объекты.

Я хочу использовать Underscore.js или какой-либо другой метод, чтобы найти все события, на которых есть рынки, с результатами, у которых есть свойство с именемtest.

Я полагаю, что это будет достигнуто с использованием серии фильтров, но мне не повезло!

 fguillen30 мая 2012 г., 20:00
Есть ли обратная ссылка? Я имею в виду отoutcome вmarket и так далее. Потому что в этом случае вы можете просто отфильтровать всеoutcome объекты, которые соответствуют вашему поиску и идут назад, покаevent, а затем очистите массив для уникальных элементов.
 user108275430 мая 2012 г., 20:13
Можете ли вы привести пример этого?

Ответы на вопрос(4)

var events = [{markets:[{outcomes:[{test:x},...]},...]},...];
return events.filter(function(event) {
    return event.markets.some(function(market) {
        return market.outcomes.some(function(outcome) {
            return "test" in outcome;
        });
    });
});

Тем не менее, вы можете также использовать соответствующие методы подчеркивания (Фильтр / выберите а такжелюбая / некоторые).

  {
    id: 'a',
    markets: [{
      outcomes: [{
        test: 'yo'
      }]
    }]
  },
  {
    id: 'b',
    markets: [{
      outcomes: [{
        untest: 'yo'
      }]
    }]
  },
  {
    id: 'c',
    markets: [{
      outcomes: [{
        notest: 'yo'
      }]
    }]
  },
  {
    id: 'd',
    markets: [{
      outcomes: [{
        test: 'yo'
      }]
    }]
  }
];

var matches = events.filter(function (event) {
  return event.markets.filter(function (market) {
    return market.outcomes.filter(function (outcome) {
      return outcome.hasOwnProperty('test');
    }).length;
  }).length;
});

matches.forEach(function (match) {
  document.writeln(match.id);
});

Вот как я бы это сделал, не завися от библиотеки:

var matches = events.filter(function (event) {
  return event.markets.filter(function (market) {
    return market.outcomes.filter(function (outcome) {
      return outcome.hasOwnProperty('test');
    }).length;
  }).length;
});
Решение Вопроса

filter а такжеsome (иначе "любые") методы:

// 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 ;
        });
    });
});
 15 апр. 2014 г., 09:10
Я думаю, что, возможно, пользователь имеет в виду lodash.js, поскольку я не вижу метода _.any в underscore.jslodash.com
 15 апр. 2014 г., 16:38
@ Фазани это Подчеркивание, а не Лодаш._.any это псевдоним для_.some: underscorejs.org/#some

_.filter(events, function(me) { 
    return me.event && 
        me.event.market && me.event.market.outcome && 
        'test' in me.event.market.outcome
}); 
DEMO
 30 мая 2012 г., 20:12
Вы забыли рынки и результаты Массивы.

Ваш ответ на вопрос