在打字稿中按'Linq like'分组

时间:2018-07-06 17:01:12

标签: linq typescript

我在Typescript中寻找一个'groupBy'方法,但它似乎仍然不是本地实现的。

赞:

const grouping = items.groupBy('propValue');

分组对象应该是{key:string,values:any []}

之类的对象的集合

2 个答案:

答案 0 :(得分:0)

经过研究,我找到了解决方案:

https://gist.github.com/guillaumegarcia13/668518119667594fdca150ebefecd194

无论如何,我将其结构化得更多一些,以实现更好的打字效果。

以下原型支持嵌套属性和可选的回调参数,以计算对元素的某些操作。

/**
 * GroupBy array extension
 */

interface Grouping<T> {
  key: string,
  values: Array<T>,
  computed: any
}

interface Array<T> {
  groupBy(prop: T, opCallBack: (group: Grouping<T>, item: T) => any): Grouping<T>[];
}

// Nested property support
function getVal(obj, prop) {
  const props = prop.split('.');
  if (props.length === 1) {
    return obj[prop];
  } else {
    return getVal(obj[props[0]], prop.slice(prop.indexOf('.') + 1, prop.length));
  }
}

if (!Array.prototype.groupBy) {
  // Return an array of 'Grouping' object
  Array.prototype.groupBy = function (prop: string, opCallBack: (group: Grouping<any>, item: any) => any = null) {
    return this.reduce((data, item) => {
      // Get value
      const val = getVal(item, prop);
      // Search val
      if (data.filter(g => g.key === val).length === 0) {
        data.push({
          key: val,
          values: []
        });
      }
      if(opCallBack) {
        opCallBack(data.find(g => g.key === val), item);
      }
      data.find(g => g.key === val).values.push(item);
      return data;
    }, []);
  }
}

/* End */

一个例子:

var a = [{a: 'aa', b: 45}, {a: 'aa', b: 45}, {a: 'aa', b: 2}, {a: 'cc', b: 4}, {a: 'cc', b: 45.6}, {a: 'bb', b: 1}];

console.log(a.groupBy('a', (group, item) => { 
  group.computed = group.computed || 0; group.computed += item.b 
}));

// Log:
[
    {
        "key": "aa",
        "values": [
            {
                "a": "aa",
                "b": 45
            },
            {
                "a": "aa",
                "b": 45
            },
            {
                "a": "aa",
                "b": 2
            }
        ],
        "computed": 92
    },
    {
        "key": "cc",
        "values": [
            {
                "a": "cc",
                "b": 4
            },
            {
                "a": "cc",
                "b": 45.6
            }
        ],
        "computed": 49.6
    },
    {
        "key": "bb",
        "values": [
            {
                "a": "bb",
                "b": 1
            }
        ],
        "computed": 1
    }
]

我希望它会有用

答案 1 :(得分:0)

默认情况下可能不是内置的,但是存在一个项目,可将类似于linq的函数带入打字稿。我建议您看看this BitBucket API上的linqts项目,以防您想使用LINQ已知的其他方法。