你怎么称呼这样的方法,是否已经存在实现?

What do you call a method like this and does an implementation already exist?

我最近用打字稿写了这个方法,它接受一个数组并从中构造一个地图。 keyFunc 从数组中获取一个元素并为构造的映射生成一个键。 valFunc 从数组中获取一个元素,并从构造的映射中获取先前的值,并生成一个新值来覆盖先前的值。 initialValue 是映射中每个条目在第一个元素映射到它时初始化的值。

private static toMap<X, Y>(
  array: X[],
  keyFunc: (element: X) => string,
  valFunc: (previousValue: Y, element: X) => Y,
  initialValue: Y
): Map<string, Y>
{
  const result = new Map<string, Y>();
  for (const el of array) {
    const key = keyFunc(el);
    let oldVal = result.get(key);
    if (oldVal === undefined) {
      oldVal = initialValue;
    }
    const newVal = valFunc(oldVal, el);
    result.set(key, newVal);
  }
  return result;
}

我在我的代码中使用了这样的方法:

const countPeopleWithEqualNames = toMap<Person, number>(
  /*array*/ allPeople,
  /*keyFunc*/ person => person.name,
  /*valFunc*/ (previousValue, person) => perviousValue + 1,
  /*initialValue*/ 0
);

const howManyAlices = countPeopleWithEqualNames.get('alice');

我想知道 javascript/typescript 中是否已经存在这样的方法。我还想知道如何调用这样的方法。这是某种合并还原,但我希望它有一个合适的名称。

可能 array.reduce 就是您要找的。你的例子可以用它来完成。

编辑:

const toMap = <X, Y>(
    array: X[],
    keyFunc: (element: X) => string,
    valFunc: (previousValue: Y, element: X) => Y,
    initialValue: Y
  ): Map<string, Y> =>
  {
    return array.reduce<Map<string, Y>>((acc, curr) => {
        const key = keyFunc(curr)
        let oldVal = acc.get(key);
        if (oldVal === undefined) {
            oldVal = initialValue;
        }
        const newVal = valFunc(oldVal, curr);
        acc.set(key, newVal);
        return acc
    }, new Map())
  }