JavaScript:两个数组的类似SQL的连接
我有这样的阵列:JavaScript:两个数组的类似SQL的连接,javascript,typescript,lodash,Javascript,Typescript,Lodash,我有这样的阵列: const one = [ {id: 1, field1: "a"}, {id: 2, field1: "b"}, {id: 3, field1: "c"}, {id: 4, field1: "d"} ] const two = [ {id: 4, field2: "4"}, {id: 1, field2: "1"} ] // wha
const one = [
{id: 1, field1: "a"},
{id: 2, field1: "b"},
{id: 3, field1: "c"},
{id: 4, field1: "d"}
]
const two = [
{id: 4, field2: "4"},
{id: 1, field2: "1"}
]
// what I want to achieve:
const result = [
{id: 1, field1: "a", field2: "1"},
{id: 4, field1: "d", field2: "4"}
]
我想合并一和二,所以我得到了结果。这非常类似于SQL连接,但我想在JavaScript代码中完成所有这一切。注意:
id
“列”进行的“连接”one
数组的顺序(按ID排序的顺序仅为巧合的相同顺序)one
并删除two
中不存在的元素,然后映射one
并合并two
数组的字段
有没有更简洁的方法来实现这一点?我使用的是lodash,我希望其中有一个函数可以简化此操作,但我没有找到任何函数。通过键(
id
)创建第二个数组的字典或映射,然后过滤第一个数组,只保留字典中出现的项。然后,映射其余项目,并从字典中添加相关项目
const joinBy=(arr1,arr2,key)=>{
常量arr2Dict=u2;.keyBy(arr2,key)
返回arr1
.filter(项目=>arr2Dict中的项目[键])
.map(项=>({…项,…arr2Dict[item[key]]}))
}
const one=[{id:1,field1:a},{id:2,field1:b},{id:3,field1:c},{id:4,field1:d}]
consttwo=[{id:4,field2:4},{id:1,field2:1}];
const result=joinBy(一,二,'id')
console.log(结果)
您可以使用lodash
中的合并
、映射
和查找
功能。用于排序-sortBy
_.sortBy(
_.map(two, (n) => _.merge(n, _.find(one, ['id', n.id]))),
(o) => _.findIndex(one, ['id', o.id]),
);
const one=[{id:1,field1:a},{id:2,field1:b},{id:3,field1:c},{id:4,field1:d}],two=[{id:4,field2:4},{id:1,field2:1}];
常数r=uu.sortBy(
_.map(两个,(n)=>u.merge(n,u.find(一个,['id',n.id])),
(o) =>查找索引(一个,['id',o.id]),
);
控制台日志(r)代码>
如果您有不同的字段,您可以获取一个对象,该对象引用项目,映射两个并按id
排序
const
one=[{id:1,field1:a},{id:2,field1:b},{id:3,field1:c},{id:4,field1:d}],
two=[{id:4,field2:4},{id:1,field2:1}],
fromOne=Object.fromEntries(one.map((Object,index)=>[Object.id,{Object,index}]),
结果=2
.map(o=>({…fromOne[o.field2].object,…o}))
.sort((a,b)=>fromOne[a.field2].index-fromOne[b.field2].index);
控制台日志(结果)代码>
.as控制台包装器{max height:100%!important;top:0;}
您可以使用。reduce确保。因此使用JS数据库:您的答案是:为什么您有field1
和field2
?@Justinas有趣的库,但它似乎与我尝试做的并不完全一致。“如果有什么区别的话,那就太过分了。”丹尼尔·卡普兰:当然,已经修好了。看起来你是按ID排序的。就像我说的,这只是我想要的顺序而已。我要第一批的订单array@DanielKaplan你明白了。看起来你是按ID排序的。就像我说的,这只是我想要的顺序。我想要第一个数组的顺序