Сначала отфильтруйте массив по датам, затем сопоставьте отфильтрованные элементы с требуемым форматом. Вы можете использовать деструктуризацию, чтобы сделать код короче:
const data = [{
"score": "1200.65",
"num_games": "160",
"wins": "110",
"year": "2013"
}, {
"score": "705.23",
"num_games": "34",
"wins": "21",
"year": "2014"
}, {
"score": "467.12",
"num_games": "77",
"wins": "30",
"year": "2015"
}];
const filterBy = (data, [min, max], prop) => data
.filter(({ year }) => year >= min && year <= max)
.map(({ year: x, [prop]: y }) => ({ x, y }));
console.log(filterBy(data, [2013, 2014], 'score'));
console.log(filterBy(data, [2013, 2013], 'wins'));
Заключенный в кавычки из http://www.geekinterview.com/question_details/64739:
Преимущества внутреннего класса:
- Логическая группировка классов: Если класс полезен только для еще одного класса затем, логично встроить его в тот класс и держать два вместе. Вложение такие "классы помощника" делает их пакет более оптимизированным.
- Увеличенная инкапсуляция: Рассмотрите два класса A верхнего уровня и B, где B нужен доступ к членам, который был бы иначе объявлен частный. Путем сокрытия класса B в классе A члены A могут быть объявлены частные, и B может получить доступ к ним. Кроме того, B самостоятельно может быть скрыт от внешнего мира.
- Больше читаемого, удобного в сопровождении кода: Вложенные маленькие классы в классах верхнего уровня помещают код ближе туда, где он используется.
Основным преимуществом является организация. Что-либо, что может быть выполнено с внутренними классами, может быть выполнено без них.
Есть ли что-то, что не может быть выполнено без них?
Нет. Они абсолютно эквивалентны определению класса обычно на верхнем уровне и затем копировании ссылки на него во внешний класс.
Я не думаю, что существуют вложенные классы любой особой причины, 'позволяются', кроме него не имеет никакого конкретного смысла явно 'запрещать' им также.
При поиске класса, который существует в течение жизненного цикла внешнего объектного / объектного владельца, и всегда имеет ссылку на экземпляр внешнего класса — inner классы, поскольку Java делает это – затем, вложенные классы Python не являются той вещью. Но можно изрубить что-то как эта вещь:
import weakref, new
class innerclass(object):
"""Descriptor for making inner classes.
Adds a property 'owner' to the inner class, pointing to the outer
owner instance.
"""
# Use a weakref dict to memoise previous results so that
# instance.Inner() always returns the same inner classobj.
#
def __init__(self, inner):
self.inner= inner
self.instances= weakref.WeakKeyDictionary()
# Not thread-safe - consider adding a lock.
#
def __get__(self, instance, _):
if instance is None:
return self.inner
if instance not in self.instances:
self.instances[instance]= new.classobj(
self.inner.__name__, (self.inner,), {'owner': instance}
)
return self.instances[instance]
# Using an inner class
#
class Outer(object):
@innerclass
class Inner(object):
def __repr__(self):
return '<%s.%s inner object of %r>' % (
self.owner.__class__.__name__,
self.__class__.__name__,
self.owner
)
>>> o1= Outer()
>>> o2= Outer()
>>> i1= o1.Inner()
>>> i1
<Outer.Inner inner object of <__main__.Outer object at 0x7fb2cd62de90>>
>>> isinstance(i1, Outer.Inner)
True
>>> isinstance(i1, o1.Inner)
True
>>> isinstance(i1, o2.Inner)
False
(Это использует декораторов класса, которые являются новыми в Python 2.6 и 3.0. Иначе необходимо было бы сказать “Внутренний = innerclass (Внутренний)” после определения класса.)
Существует что-то, что необходимо перенести голову, чтобы смочь понять это. На большинстве языков определения классов являются директивами к компилятору. Таким образом, класс создается, прежде чем программа когда-либо запускается. В Python все операторы являются исполняемым файлом. Это означает что этот оператор:
class foo(object):
pass
оператор, который выполняется во времени выполнения точно так же, как этот:
x = y + z
Это означает, что мало того, что можно создать классы в других классах, можно создать классы где угодно, Вы хотите. Рассмотрите этот код:
def foo():
class bar(object):
...
z = bar()
Таким образом идея "внутреннего класса" не является действительно конструкцией языка; это - конструкция программиста. У Guido есть очень хорошая сводка того, как это появилось здесь. Но по существу, основная идея, это упрощает грамматику языка.
Вложенные классы в классах:
Вложенные классы чрезмерно увеличивают размер определения класса, мешающего видеть то, что продолжается.
Вложенные классы могут создать связь, которая сделала бы тестирование более трудным.
В Python можно поместить больше чем один класс в файл/модуль, в отличие от Java, таким образом, класс все еще остается рядом с высокоуровневым классом и мог даже снабдить префиксом имя класса "_", чтобы помочь показать, что другие не должны использовать его.
Место, где вложенные классы могут оказаться полезными, в функциях
def some_func(a, b, c):
class SomeClass(a):
def some_method(self):
return b
SomeClass.__doc__ = c
return SomeClass
Класс получает значения от функции, разрешающей Вам динамично создать класс как шаблонное метапрограммирование в C++