假设我们有2组对象

set1 = [{'id':'1', 'x':'1', 'y':'2'}, {'id':'2', 'x':'2', 'y':'2'}]
set2 = [{'id':'1', 'z':'1'}, {'id':'2', 'z':'2'}]

我们想要:
set3 = set1.join(set2).on('id');

>> set3
[{'id':'1', 'x':'1', 'y':'2', 'z':'1'},{'id':'2', 'x':'2', 'y':'2', 'z':'2'}]

什么是实现此功能的正确工具?
underscore 可以在这里帮助吗?

最佳答案

选项1 ,普通js

我建议您将每个列表按ID转换为一组,例如

{1: {x: 1, y: 1}, 2: {x: 2, y: 2}}

然后为其中一个(或两个)集合运行a,并创建一个具有这两个属性的新字典-后一点取决于您要查找内部联接还是外部联接。这应该导致大致线性的运行时,字典的javascript实现非常有效。

选项2下划线,使用_.zip()用于密集的ID集

如果id相对密集,并且您希望外部联接,或者事先知道ID集完全相同,则另一种选择是将数据填充到三个数组中-每个属性一个,然后使用下划线的zip()方法。

选项3 下划线,使用_.groupBy()

使用自定义比较方法在您拥有的列表上运行_.groupBy()的另一种可能性,该方法还允许连接多个键。不过,由于直接结果将是以下形式的字典,因此将需要一些简单的后处理
{1: [{'id':'1', 'x':'1', 'y':'2'}, {'id':'1', 'z':'1'}],
 2: [{'id':'2', 'x':'2', 'y':'2'}, {'id':'2', 'z':'2'}]}

在后一种情况下,内部联接行为可以通过过滤出结果字典中列表中没有最大数目的那些项(在此示例中为2)来实现。

09-30 16:06
查看更多