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

Using Linq.js to compare every member of an array of objects?

本文关键字:成员 数组 对象 Linq js 比较 使用      更新时间:2023-09-26

我正在为内部网格工具构建一个过滤函数,我有点卡在如何使用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));