26 lines
870 B
TypeScript
26 lines
870 B
TypeScript
|
// License: LGPL-3.0-or-later
|
||
|
// from https://github.com/mtraynham/lodash-joins/blob/c252b462981562451d85d1e09c8f273ce7fe06c5/lib/hash/hashLeftSemiJoin.ts
|
||
|
import filter from 'lodash/filter';
|
||
|
import has from 'lodash/has';
|
||
|
import keyBy from 'lodash/keyBy';
|
||
|
|
||
|
import {Accessor} from '../typings';
|
||
|
import {toStringAccessor} from './util';
|
||
|
|
||
|
/**
|
||
|
* Hash left semi join
|
||
|
*/
|
||
|
export default function hashLeftSemiJoin<LeftRow, RightRow, Key>(
|
||
|
a: LeftRow[],
|
||
|
aAccessor: Accessor<LeftRow, Key>,
|
||
|
b: RightRow[],
|
||
|
bAccessor: Accessor<RightRow, Key>
|
||
|
): LeftRow[] {
|
||
|
if (a.length < 1 || b.length < 1) {
|
||
|
return [];
|
||
|
}
|
||
|
const index: {[key: string]: RightRow} = keyBy(b, toStringAccessor(bAccessor)),
|
||
|
leftAccessor: Accessor<LeftRow, string> = toStringAccessor(aAccessor);
|
||
|
return filter(a, (aDatum: LeftRow) => has(index, leftAccessor(aDatum)));
|
||
|
}
|