#javascript #typescript #linq #group-by #linq.js
#javascript #typescript #linq #группировать по #linq.js
Вопрос:
У меня есть массив объектов JSON, которые должны быть сгруппированы по нескольким свойствам.
const JSON_DATA = [
{"componentName":"CP1","articleNumber":"441","componentType":"Ext","version":"V1.1.6"},
{"componentName":"CP5","articleNumber":"444","componentType":"Int","version":"V2.1.8"},
{"componentName":"CP5","articleNumber":"444","componentType":"Ext","version":"V2.1.0"},
{"componentName":"CP5","articleNumber":"444","componentType":"Ext","version":"V2.1.8"},
{"componentName":"CP4","articleNumber":"442","componentType":"Ext","version":"V1.1.0"}];
Я хотел бы использовать linqts для группировки по имени компонента, артиклю и типу компонента.
interface IComponent {
componentName: String;
articleNumber: String;
componentType: String;
version: String;
}
class JsonGroupBy {
public groupBy(data: IComponent[]): any {
let mylist = new List < IComponent > (data);
let result = mylist.GroupBy((comp) => comp.componentName, (comp) => comp.version);
return resu<
}
}
Это работает, но я не могу понять, как группировать не только по имени компонента, но также по articleNumber и componentType. Текущий вывод выглядит следующим образом:
{"CP1": ["V1.1.6"], "CP4": ["V1.1.0"], "CP5": ["V2.1.8", "V2.1.0", "V2.1.8"]}
Мой предпочтительный результат был бы таким:
[
{"componentName": "CP1","articleNumber":"441","componentType":"Ext","version": ["V1.1.6"]},
{"componentName": "CP5","articleNumber":"444","componentType":"Int","version": ["V2.1.8"]},
{"componentName": "CP5","articleNumber":"444","componentType":"Ext","version": ["V2.1.0","2.1.8"]},
{"componentName": "CP4","articleNumber":"442","componentType":"Ext","version": ["V1.1.0"]}
]
Комментарии:
1.
linqts
почти то же самое, чтоlinqjs
?2. @Nina Scholz это не одно и то же, но я бы выбрал решение linqjs, если вы можете его предоставить.
Ответ №1:
Вы могли бы собрать версию и создать новый набор данных для каждой группы.
const
JSON_DATA = [{ componentName: "CP1", articleNumber: "441", componentType: "Ext", version: "V1.1.6" }, { componentName: "CP5", articleNumber: "444", componentType: "Int", version: "V2.1.8" }, { componentName: "CP5", articleNumber: "444", componentType: "Ext", version: "V2.1.0" }, { componentName: "CP5", articleNumber: "444", componentType: "Ext", version: "V2.1.8" }, { componentName: "CP4", articleNumber: "442", componentType: "Ext", version: "V1.1.0" }],
result = Enumerable
.From(JSON_DATA)
.GroupBy(
null,
"$.version",
"{ componentName: $.componentName, articleNumber: $.articleNumber, componentType: $.componentType, version: $$.ToArray() }",
"[$.componentName, $.articleNumber, $.componentType].join('|')"
)
.ToArray();
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.js"></script>