我正在为内部网格工具构建一个过滤功能,我对如何将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;
}
答案 0 :(得分:0)
这很容易......你不提供任何细节,但“大纲”取决于你想做什么。您可以获得具有以下感兴趣字段的行列表:
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));