Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:两个数组的类似SQL的连接_Javascript_Typescript_Lodash - Fatal编程技术网

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排序的。就像我说的,这只是我想要的顺序。我想要第一个数组的顺序