在 Lodash 中合并(内部连接)仅保留具有公共键的行
Merge (inner join) in Lodash keeping only rows with common keys
尝试使用 lodash 合并两个 API 的 return,我设法使用合并将它们中的公共字段连接起来:
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);
但是我只需要定义了 id
和 franchise_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
}
]
我试过像这样使用过滤器,但它 return 两者都是一个空数组:
var leftFiltered = _.filter(values, ['id', null]);
var rightFiltered = _.filter(leftFiltered, ['franchise_id', undefined]);
如何进行这样的内部合并?
[
{
"id": 1,
"name": "bar",
"address": "two",
"franchise_id": 1,
"count": 4
},
]
您可以创建自定义过滤和映射逻辑或使用 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 } ]
尝试使用 lodash 合并两个 API 的 return,我设法使用合并将它们中的公共字段连接起来:
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);
但是我只需要定义了 id
和 franchise_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
}
]
我试过像这样使用过滤器,但它 return 两者都是一个空数组:
var leftFiltered = _.filter(values, ['id', null]);
var rightFiltered = _.filter(leftFiltered, ['franchise_id', undefined]);
如何进行这样的内部合并?
[
{
"id": 1,
"name": "bar",
"address": "two",
"franchise_id": 1,
"count": 4
},
]
您可以创建自定义过滤和映射逻辑或使用 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 } ]