使用Linq.js比较对象数组的每个成员
本文关键字:成员 数组 对象 Linq js 比较 使用 | 更新日期: 2023-09-27 18:12:19
我正在为内部网格工具构建一个过滤函数,我有点卡在如何使用linq.js与Typescript
我们的网格由一个数据对象组成。这个数据对象有一个名为"rows"的成员,它是一个对象数组。
数组在技术上被分类为"any",但通常它们有一个固定的属性集(必须与网格匹配)。
我需要查询这个数组中的每个字段,如果任何字段匹配过滤器,它们应该被添加到列表中。
结构是这样的
grid
----data
--------rows
------------Row
---------------cell
------------------prop1
------------------prop2
---------------cell
------------------prop1
------------------prop2
---------------cell
------------------prop1
------------------prop2
------------Row
---------------cell
------------------prop1
------------------prop2
---------------cell
------------------prop1
------------------prop2
---------------cell
------------------prop1
------------------prop2
对象的示例可以类似于:
{
"grid":{
"rows":[
{
"row":[
{
"cells":[
{
"fieldName":"test",
"value":"testing1",
"displayText":"testing 1"
},
{
"fieldName":"test 2",
"value":"testing2",
"displayText":"testing 2"
}
]
}
]
},
{
"row":[
{
"cells":[
{
"fieldName":"test",
"value":"testing1",
"displayText":"testing 1"
},
{
"fieldName":"test 2",
"value":"testing2",
"displayText":"testing 2"
}
]
}
]
}
]
}
}
在伪代码中,使用foreach循环,它可能看起来类似于以下内容:
List items = new List();
string comparator = "testing";
foreach(row item in grid.rows) {
foreach(cell c in item.cells) {
foreach(var field in c.fields) {
if(field.value.contains(comparator)
items.add(item);
}
}
}
编辑
下面是一个工作片段。问题是,我永远不会知道Grid类本身内部的行的属性名称是什么。这一切都是由聚合物模板处理的。
private _filterData(filter: string): any {
var filteredRows: Array<any> = new Array();
var rel = this.el;
if (filter != null) {
Enumerable.from(rel.data.rows).forEach(n => {
Enumerable.from(n.cells).forEach(c => {
Object.keys(c).forEach(p => {
if (c[p].indexOf(filter)>=0) {
filteredRows.push(n);
}
});
});
});
}
return filteredRows;
}
这很容易…你不必给出任何细节,但"大纲"取决于你想做什么。您可以获得具有感兴趣字段的行的列表,如下所示:
var result = rows.Where(row => row.Fields.Any(<<function to filter>>));
如果您只需要感兴趣的字段的列表,请使用SelectMany,如下所示: 根据下面的评论和问题编辑: var result = rows.SelectMany(row => row.Fields).Where(<<function to filter>>);
var inessence = rows.SelectMany(row => row.cells)
.SelectMany(cell => cell.fields)
.Where(field => field.value.constains(comparator));