【问题标题】:Merge (inner join) in Lodash keeping only rows with common keys在 Lodash 中合并(内部连接)只保留具有公共键的行
【发布时间】:2020-11-21 17:05:59
【问题描述】:

尝试使用 lodash 组合两个 API 的返回,我已经设法使用合并来加入其中的公共字段:

var primaryCount = [
    {id: 0, name: "foo", address: "one"},
    {id: 1, name: "bar", address: "two"},
];
var secondaryCount = [
    {franchise_id: 1, count:4},
  {franchise_id: 3, count:16},
]

var merged = _.merge(_.keyBy(primaryCount, 'id'), _.keyBy(secondaryCount, 'franchise_id'));
var values = _.values(merged);

但是,我只需要定义两个字段 idfranchise_id 的项目。然而,它产生的字段只存在于其中一个中(我只想要id:1):

[
   {
      "id": 0,
      "name": "foo",
      "address": "one"
   },
   {
      "id": 1,
      "name": "bar",
      "address": "two",
      "franchise_id": 1,
      "count": 4
   },
   {
      "franchise_id": 3,
      "count": 16
   }
]

我尝试使用这样的过滤器,但它为两者返回一个空数组:

var leftFiltered = _.filter(values, ['id', null]);
var rightFiltered = _.filter(leftFiltered, ['franchise_id', undefined]);

我怎样才能进行这样的内部合并?

[
   {
      "id": 1,
      "name": "bar",
      "address": "two",
      "franchise_id": 1,
      "count": 4
   },
]

【问题讨论】:

    标签: javascript merge filtering lodash


    【解决方案1】:

    您可以创建自定义过滤和映射逻辑或使用类似lodash-joins

    #### Example:
    > var _ = require('index.js');
    > var left = [
    ...       {id: 'c', left: 0},
    ...       {id: 'c', left: 1},
    ...       {id: 'e', left: 2},
    ...   ],
    ...   right = [
    ...       {id: 'a', right: 0},
    ...       {id: 'b', right: 1},
    ...       {id: 'c', right: 2},
    ...       {id: 'c', right: 3},
    ...       {id: 'd', right: 4},
    ...       {id: 'f', right: 5},
    ...       {id: 'g', right: 6}
    ...   ],
    ...   accessor = function (obj) {
    ...       return obj['id'];
    ...   };
    >
    > var a = _.hashInnerJoin(left, accessor, right, accessor);
    undefined
    > a
    [ { id: 'c', left: 0, right: 2 },
      { id: 'c', left: 1, right: 2 },
      { id: 'c', left: 0, right: 3 },
      { id: 'c', left: 1, right: 3 } ]
    >
    > var b = _.nestedLoopLeftOuterJoin(left, accessor, right, accessor);
    undefined
    > b
    [ { id: 'c', left: 0, right: 2 },
      { id: 'c', left: 0, right: 3 },
      { id: 'c', left: 1, right: 2 },
      { id: 'c', left: 1, right: 3 },
      { id: 'e', left: 2 } ]
    >
    > var c = _.sortedMergeFullOuterJoin(left, accessor, right, accessor);
    undefined
    > c
    [ { id: 'a', right: 0 },
      { id: 'b', right: 1 },
      { id: 'c', left: 0, right: 2 },
      { id: 'c', left: 0, right: 3 },
      { id: 'c', left: 1, right: 2 },
      { id: 'c', left: 1, right: 3 },
      { id: 'd', right: 4 },
      { id: 'e', left: 2 },
      { id: 'f', right: 5 },
      { id: 'g', right: 6 } ]
    

    【讨论】:

    • 我不知道这个库,使用 hashInnerJoin 和两个不同的访问函数(一个用于连接的每个“边”)解决了我的问题,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2017-07-21
    • 1970-01-01
    • 2015-04-22
    相关资源
    最近更新 更多