Вы можете использовать .filter
, чтобы получить объекты в требуемом диапазоне, а затем использовать .map
для создания объектов из отфильтрованного списка.
См. Пример ниже:
const arr = [{
"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 get_items = (arr, [sY, eY], prop) =>
arr
.filter(({year}) => +sY <= year && year <= +eY)
.map(({year:x, ...rest}) => ({x, y: rest[prop]}));
console.log(get_items(arr, ["2014", "2015"], "score"));
Примечание: Ответ ниже только действителен для Java EE 5. Как был обращен мое внимание в одном из других ответов, Java EE 6 действительно поддерживает это. Таким образом, при использовании Java EE 6 не читайте этот ответ, но читайте другой соответствующий ответ.
От моего собственного исследования и от ответов до этого вопроса ответ, который я нашел, следующий: Хотя JAAS является стандартным интерфейсом, нет никакого универсального способа записать, развернуть и интегрировать Область JAAS + LoginModule в различных серверах приложений.
Glassfish v2 требует, чтобы Вы расширили некоторые его собственные внутренние классы, которые реализуют LoginModule или Область сами. Вы не можете однако настроить целый процесс входа в систему, потому что много методов интерфейса LoginModule отмечены финал в суперклассе Glassfish. Пользовательские классы LoginModule и Области должны быть помещены в путь к классу AS (не приложение), и область должна быть вручную зарегистрирована (никакое развертывание от .war возможного).
Ситуация, кажется, немного лучше для Tomcat, который позволит Вам кодировать свою собственную Область и LoginModule полностью, и затем настроить их в сервер приложений с помощью его собственного JAASRealm (который делегирует фактическую работу к реализациям Области и LoginModule). Однако даже кот не позволяет развертывать Вашу пользовательскую область от Вашего .war.
Обратите внимание, что ни один из Серверов приложений, которые разоблачили мои результаты, кажется, не может в полной мере воспользоваться всеми Обратными вызовами JAAS. Все они, кажется, только поддерживают основную username+password схему. Если Вам будет нужно что-либо более сложное, чем это, то необходимо будет найти решение, которым не управляет Java контейнер EE.
Для ссылки, и потому что относительно этого попросили в комментариях к моему вопросу, вот код, который я написал для GlassfishV2.
В первую очередь, вот реализация Области:
public class WebserviceRealm extends AppservRealm {
private static final Logger log = Logger.getLogger(WebserviceRealm.class.getName());
private String jaasCtxName;
private String hostName;
private int port;
private String uri;
@Override
protected void init(Properties props) throws BadRealmException, NoSuchRealmException {
_logger.info("My Webservice Realm : init()");
// read the configuration properties from the user-supplied properties,
// use reasonable default values if not present
this.jaasCtxName = props.getProperty("jaas-context", "myWebserviceRealm");
this.hostName = props.getProperty("hostName", "localhost");
this.uri = props.getProperty("uri", "/myws/EPS");
this.port = 8181;
String configPort = props.getProperty("port");
if(configPort != null){
try{
this.port = Integer.parseInt(configPort);
}catch(NumberFormatException nfe){
log.warning("Illegal port number: " + configPort + ", using default port (8181) instead");
}
}
}
@Override
public String getJAASContext() {
return jaasCtxName;
}
public Enumeration getGroupNames(String string) throws InvalidOperationException, NoSuchUserException {
List groupNames = new LinkedList();
return (Enumeration) groupNames;
}
public String getAuthType() {
return "My Webservice Realm";
}
public String getHostName() {
return hostName;
}
public int getPort() {
return port;
}
public String getUri() {
return uri;
}
}
И затем реализация LoginModule:
public class WebserviceLoginModule extends AppservPasswordLoginModule {
// all variables starting with _ are supplied by the superclass, and must be filled
// in appropriately
@Override
protected void authenticateUser() throws LoginException {
if (_username == null || _password == null) {
throw new LoginException("username and password cannot be null");
}
String[] groups = this.getWebserviceClient().login(_username, _password);
// must be called as last operation of the login method
this.commitUserAuthentication(groups);
}
@Override
public boolean commit() throws LoginException {
if (!_succeeded) {
return false;
}
// fetch some more information through the webservice...
return super.commit();
}
private WebserviceClient getWebserviceClient(){
return theWebserviceClient;
}
}
наконец, в Области должен быть связан с LoginModule. Это сделано на уровне конфигурационного файла JAAS, который в glassfish v2 находится в yourDomain/config/login.conf. Добавьте следующие строки в конце того файла:
myWebserviceRealm { // use whatever String is returned from you realm's getJAASContext() method
my.auth.login.WebserviceLoginModule required;
};
Это - то, что получило вещи, работающие на меня на glassfish. Снова, это решение не является портативным через серверы приложений, но насколько я могу сказать, нет никакого существующего портативного решения.
Наличие имеет беглый взгляд на документацию Солнц, похоже, что необходимо будет записать пользовательский LoginModule, который расширяет их сервер приложений определенный класс. Это кажется немногим назад мне и ограничению Glassfish.
Если бы Вы хотите сделать это более портативное, я предложил бы поместить объем реализации в пользовательском LoginModule, разработанном против стандартного интерфейса (интерфейсов) JavaEE и затем иметь тонкий слой реализации, характерный для Glassfish, который делегирует к стандартной, портативной реализации.
Вы никогда не можете развертывать область от ВОЙНЫ, потому что область НЕ является Артефактом Приложения, это - Контейнерный Артефакт (таким образом фраза "основанная на контейнере безопасность"). Можно настроить приложение для использования определенной области в соответствии с контейнером, но приложение не может обеспечить это само.
Тем не менее, в то время как все контейнеры отличаются, и эти области НЕ являются портативными, простой здравый смысл уменьшит различия до немного кода связующего звена, необходимого для интеграции с контейнером при поиске мобильности.
Проверьте статью Sun об этом предмете.
Я никогда на самом деле сделал это сам, но я довольно уверен, что каждый AS дает Вам опцию зарегистрировать новые области (домены защиты) на нем.
Это, вероятно, не будет 100%-е портативное устройство, и для каждого AS Вам, возможно, понадобилась бы различная конфигурация XML, но в основном, нет никакой причины кода, чтобы несколько отличаться.