使用Linq.js比较对象数组的每个成员?

时间:2015-09-11 19:46:01

标签: javascript c# linq typescript

我正在为内部网格工具构建一个过滤功能,我对如何将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;
}

1 个答案:

答案 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));