Javascript.连接两组对象的最佳方式,如SQL
Javascript. Optimal way to join 2 sets of objects like in SQL?
让我们假设我们有两组对象
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}}
然后对其中一个(或两个)集合运行一个,并使用这两个集合的属性创建一个新的字典——后一点取决于您是在寻找内部联接还是外部联接。这应该会产生一个大致线性的运行时,字典的javascript实现非常高效。
选项2,下划线,用于密集id集,使用_.zip()
如果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)来实现。
Alasql可以以"SQL方式"连接两个表
var set1 = [{'id':'1', 'x':'1', 'y':'2'}, {'id':'2', 'x':'2', 'y':'2'}];
var set2 = [{'id':'1', 'z':'1'}, {'id':'2', 'z':'2'}];
var res = alasql('SELECT * FROM ? set1 JOIN ? set2 USING id',[set1, set2]);
它提供了您所需要的:
[{"z":"1","id":"1","x":"1","y":"2"},{"z":"2","id":"2","x":"2","y":"2"}]
在jsFiddle中尝试这个例子。
使用Ramda的另一个选项:
const r = require('ramda')
const outerJoin = r.curry(function(relationName, set1, keyName1, set2, keyName2) {
const processRecord = function(record1) {
const key1 = record1[keyName1]
const findIn2 = r.find(r.propEq(keyName2, key1))
const record2 = findIn2(set2)
record1[relationName] = record2
return record1
}
return r.map(processRecord, set1)
})
假设
//set1 is an array of objects
set1 : [{}]
//set1 has a property for the key of type T
set1[keyName1] : T
//set2 is an array of objects
set2 : [{}]
//set2 has a property for the key which is also of type T
set2[keyName2] : T
输出
[{
...set1 members...
, relationName: ...set2 members...
}]
我想更好的输出可能是(在这里应该不难获得):
[{
, leftObj:...set1 members...
, rightObj: ...set2 members...
}]
并添加对内部联接的支持。但我替换了一些糟糕的代码,需要复制对象层次结构。
相关文章:
- 在localhost Dev Box上测试JSONP请求的最佳方式
- 为react组件传递道具的最佳方式
- 让Webpack管理Quirky AMD定义的最佳方式
- 在承诺链中处理早期回报的最佳方式
- 在ng重复循环中显示条件内容的最佳方式是什么
- 在phonegap中为android调用onload函数的最佳方式
- 链接两个网页或网络应用程序的最佳方式
- 什么's是连接供应商js文件的最佳方式
- 什么's是在javascript中迭代项的最佳方式
- 在node.js中编写单元测试的最佳方式是什么
- 在页面上记录数据并实现pushstate()的最佳方式
- 使用AJAX在Rails中提交动态表单的最佳方式是什么
- 什么'这是加载jQuery的最佳方式
- 将大数组(字符串和类型数组的混合物)存储到blob或文件中/从blob或文件检索大数组的最佳方式
- 在网站上显示.mov作为加载屏幕的最佳方式
- 使用Angular存储用户以前是否选中过复选框,然后再调用它的最佳方式是什么
- 以角度渲染表中数据的最佳方式
- 删除集合中旧邮件/帖子的最佳方式
- 显示全屏Ajax加载程序的最佳方式
- PHP和JS中表单验证的最佳方式