Ответ уже был дан, при всем уважении к автору ответа, я утверждаю, что могут быть сделаны некоторые улучшения в ответе, как синтаксически, так и с точки зрения производительности:
reduce
следует избегать, если источник очень большой, хотя я всегда предпочитаю reduce
, если источник относительно мал (data.length < 1000). Попробуйте использовать POF (обычный старый для :)) , так как это самый быстрый вариант.
Карта ES6 является хорошим помощником, когда мы имеем дело с парами ключ-значение , но я предпочитаю POO (plain old object:) ), если это возможно и это сделает наш код более эстетичным.
Я предоставлю свое решение этой проблемы (в худшем случае он запустит O (n) и использует дополнительное пространство O (n) для пар ключ-значение, он выполнит два прохода на источнике, второй проход необходим, чтобы поставить 1 там, где мы пропустили, когда мы впервые встретились с ним на первом проходе):
let data = [
{count: 400, value: "Car Wash Drops"},
{count: 48, value: "Personal/Seeding"},
{count: 48, value: "Personal/Seeding"},
{count: 300, value: "Operators/Management"},
{count: 48, value: "Personal/Seeding"}
];
const map = {};
for (let i=0;i[o.value,o.count]));
или более краткая версия с использованием оператора ES6 of
[ссылка на] :
let data = [
{count: 400, value: "Car Wash Drops"},
{count: 48, value: "Personal/Seeding"},
{count: 48, value: "Personal/Seeding"},
{count: 300, value: "Operators/Management"},
{count: 48, value: "Personal/Seeding"}
];
const map = {};
for (let d of data) {
map[d.value] = map[d.value]+1 || 0;
d.value = map[d.value]?d.value+` (${map[d.value]+1})`:d.value;
}
for (let d of data) {
d.value = map[d.value]?d.value+` (1)`:d.value;
}
console.log(data.map(o=>[o.value,o.count]));
Гул... Я только что нашел по крайней мере одну возможную проблему с Динамическим Linq. Просто должностное лицо этот отрывок 1000 раз и часы для потребления ресурсов ЦП и потребления памяти, идущего высоко (создающий простой способ к атаке "отказ в обслуживании"):
var lambda = DynamicExpression
.ParseLambda<Order, bool>("Customer=string.Format(\"{0,9999999}"+
"{0,9999999}{0,9999999}{0,9999999}{0,9999999}\",Customer)")
.Compile();
var arg = new Order
{
Total = 11
};
Console.WriteLine(lambda(arg));
Я записал сообщение в блоге на этом.
Поскольку LINQ к SQL использует безопасные с точки зрения типов классы модели данных, Вы защищены от Атак с использованием кода на SQL по умолчанию. LINQ к SQL автоматически закодирует значения на основе базового типа данных.
(c) ScottGu
Но можно все еще добраться, "делятся на нуль" там, таким образом, рекомендуется обработать все непредвиденные исключительные ситуации и также ограничить продолжительность действительных доступов, JIC
Просто мысль, но Вы посмотрели на Услуги передачи данных ADO.NET? Это обеспечивает, поддерживающий REST API во многом как вышеупомянутое с большой стандартной функциональностью LINQ встроил.
Я не могу думать об интересе динамическое использование LINQ вершины моей головы, но если бы это было я, то я, по крайней мере, добавил бы участников в белый список (OrderID
, CustomerName
, и т.д.) - но я, вероятно, записал бы Expression
логика непосредственно; не особенно трудно, если Вы только поддерживаете прямые свойства.
Например, вот Where
(использование Вашего Contains
логика):
static IQueryable<T> Where<T>(this IQueryable<T> source,
string member, string value)
{
var param = Expression.Parameter(typeof(T), "x");
var arg = Expression.Constant(value, typeof(string));
var prop = Expression.PropertyOrField(param, member);
MethodInfo method = typeof(string).GetMethod(
"Contains", new[] { typeof(string) });
var invoke = Expression.Call(prop, method, arg);
var lambda = Expression.Lambda<Func<T, bool>>(invoke, param);
return source.Where(lambda);
}
Я покрыл OrderBy
ранее, здесь.