В дополнение к превосходному и всестороннему ответу ninjagecko все, что требуется, чтобы закрепить два JS-массива в «tuple-mimic»:
//Arrays: aIn, aOut
Array.prototype.map.call( aIn, function(e,i){return [e, aOut[i]];})
Объяснение: Поскольку Javascript не имеет tuples
, функции для кортежей, списков и наборов не были высокоприоритетными в спецификации языка. В противном случае подобное поведение доступно простым способом с помощью карты массива в JS> 1,6 . (map
на самом деле часто реализуется разработчиками двигателей JS во многих двигателях JS 1.4, несмотря на то, что они не указаны). Основное отличие от zip
, izip
от Python, ... от функционального стиля map
, так как map
требует аргумента функции. Кроме того, это функция Array
. Вместо этого можно использовать Array.prototype.map
, если возникает дополнительная декларация для ввода.
Пример:
_tarrin = [0..constructor, function(){}, false, undefined, '', 100, 123.324,
2343243243242343242354365476453654625345345, 'sdf23423dsfsdf',
'sdf2324.234dfs','234,234fsf','100,100','100.100']
_parseInt = function(i){return parseInt(i);}
_tarrout = _tarrin.map(_parseInt)
_tarrin.map(function(e,i,a){return [e, _tarrout[i]]})
Результат:
//'('+_tarrin.map(function(e,i,a){return [e, _tarrout[i]]}).join('),\n(')+')'
>>
(function Number() { [native code] },NaN),
(function (){},NaN),
(false,NaN),
(,NaN),
(,NaN),
(100,100),
(123.324,123),
(2.3432432432423434e+42,2),
(sdf23423dsfsdf,NaN),
(sdf2324.234dfs,NaN),
(234,234fsf,234),
(100,100,100),
(100.100,100)
Связанная производительность:
Использование map
над for
-loops:
См. . Каков наиболее эффективный способ слияния [1,2] и [7, 8] в [[1,7], [2,8]]
[/g2]
Примечание: базовые типы, такие как false
и undefined
не обладают прототипной иерархией объектов и, следовательно, не предоставляют функцию toString
. Следовательно, они отображаются как пустые в выводе. Поскольку второй аргумент parseInt
является базовым / числовым основанием, которому нужно преобразовать число в, и поскольку map
передает индекс в качестве второго аргумента своей аргумент-функции, используется функция-обертка.
Другие, вероятно, будут предлагать технические ответы (например, синтаксис запроса, использование кэширования, упрощение или иное отображение в существующей структуре базы данных) - но если у вас установленный уровень ORM, ответ, вероятно, будет
«Зачем что-то менять?»
Я годами успешно использовал XPO в устоявшемся коммерческом продукте с несколькими сотнями пользователей. Я считаю, что это быстро, гибко и делает свою работу. Я не вижу необходимости менять в данный момент, так как наши объемы данных не особенно велики, и слабые места (в основном, кеширование) - это то, что мы можем обойти.
Если бы я начинал с нуля, я бы определенно посмотрел и на NHibernate, и на ADO.NET Entity Framework. Однако на практике все хорошо; Скорее всего, я бы посмотрел на коммерческую ситуацию для проекта, а не на технические вопросы.
Например, NHibernate является открытым исходным кодом - существует ли жизнеспособное сообщество для поддержки инструмента и для предоставления (при необходимости) коммерческой поддержки?
XPO исходит от поставщика инструментов, могут ли они оставаться в бизнесе на протяжении всего срока службы продукта?
ADO.NET Entity Framework исходит от Microsoft, которая печально известна тем, что меняет технологии баз данных чаще, чем Ларри заправляет свой истребитель реактивным топливом - это тоже исчезнет?
Я нашел XPO очень печальный для работы с. Основная идея ORM состоит в том, чтобы абстрагировать далеко базовую структуру данных. Но очень быстро Вы заметите, что у них есть длина строки по умолчанию hardcoded к 60 символам, таким образом, Вы заканчиваете тем, что добавили эти ужасные string.unlimited вещи вокруг каждой строки. Так для абстракции...
При моделировании более сложного объекта необходимо использовать много синтаксиса, который действительно не имеет никакого места в объектной модели, как XPCollection. Я хотел сохранить класс, который имел словарь строк на классе, но печально XPO не смог автоматически сохранить это в базу данных.
Поэтому, в то время как это работает хорошо на простые типы, это очень быстро ломается, когда Вы хотите сохранить более сложные вещи. Это объединилось с их посредственной поддержкой, действительно оставляет желать лучшего.
Я работаю с ним уже 6-7 месяцев, и продавцом для меня был тот факт, что все их компоненты пользовательского интерфейса относительно легко работают с XPO - а их компоненты пользовательского интерфейса превосходны.
Некоторые могут заметить, что их форумы плохо контролируются и имеют мало полезного трафика - это правда. Секрет в том, чтобы заполнить билеты, хотя. Они реагируют быстро и точно на все свои билеты поддержки.
С XPO в целом легко работать. Однако может возникнуть небольшая боль, когда вы планируете работать с устаревшей базой данных или пытаетесь внедрить ее в приложение «коричневого поля». Наиболее болезненные препятствия, с которыми я столкнулся, были:
Как отметил Деннис в комментариях, XPO был значительно улучшен с тех пор, как я написал этот ответ изначально. В частности, перечисленные ниже проблемы больше не являются проблемой:
Кроме того, следующие проблемы больше не будут проблемой со следующим выпуском XPO, который выйдет позже в этом году:
В целом XPO был значительно улучшен. Большинство болезненных препятствий были устранены. Вы все еще можете столкнуться с проблемами при работе с устаревшей БД. Но в целом XPO стало довольно удобно использовать.
Плюсы и минусы по сравнению с чем? Существует множество альтернатив, наиболее популярным из которых является nHibernate, с новым детским ADO.NET Entity Framework в блоке.
В любом случае, есть сотни ответов в зависимости от вашей ситуации и требований.
Мне нравится то, что можно просто создать классы, и xpo составляет таблицы и отношения для Вас - таким образом, можно запустить с пустой базы данных.
Одна проблема, которую я не люблю, - когда я захочу удалить целый набор материала, она пройдет мой набор и сделает удаление на каждом. Это берет возрасты, таким образом, для этого вида экземпляра, я должен был записать, некоторый пользовательский sql (удалите из таблицы где вздор). Я не эксперт по XPO, но это - то, что я нашел.
Я подтверждаю тот факт, что удаление сложных объектов в некоторых коллекциях занимает очень много времени. До сих пор документация или форумы не могли мне помочь с этим.
Кроме того, он очень прост в использовании и позволяет быстро начать работу.
Также довольно сложно выяснить, как вы используете память, у меня были сложные объекты в моем дизайне, и работа с ними была боровом памяти больше, чем я предполагал.
Это все, что вам нужно сделать, чтобы начать писать объекты домена (попробуйте сделать то же самое в других системах):
using System;
using DevExpress.Xpo;
using DevExpress.Data.Filtering;
using NUnit.Framework;
namespace XpoTdd {
public class Person:XPObject {
public Person(Session session) : base(session) { }
public string FirstName { get; set; }
public string LastName { get; set; }
[Persistent]
public string FullName { get { return FirstName + " " + LastName; } }
}
[TestFixture]
public class PersonTests {
[Test]
public void TestPersistence() {
const string connStr = "Integrated Security=SSPI;Pooling=false;Data Source=(local);Initial Catalog=XpoTddTest";
UnitOfWork session1 = new UnitOfWork();
session1.ConnectionString = connStr;
Person me = new Person(session1);
me.FirstName = "Roman";
me.LastName = "Eremin";
session1.CommitChanges();
UnitOfWork session2 = new UnitOfWork();
session2.ConnectionString = connStr;
me = session2.FindObject<Person>(CriteriaOperator.Parse("FullName = 'Roman Eremin'"));
Assert.AreEqual("Roman Eremin", me.FullName);
}
}
}