lodash 过滤对象数组并分组依据创建新数组
lodash filter object array and group by to create a new array
下面是主数组,我想按 dept.name 分组并将除“e-depid”之外的所有其他字段删除到单个数组
主数组
[
{
"id": "67",
"empid": 5,
"e-depid": "ab",
"dept": { "name": "Prod" }
},
{
"id": "67",
"empid": 7,
"e-depid": "ac",
"dept": { "name": "Prod" }
},
{
"id": "67",
"empid": 5,
"e-depid": "ad",
"dept": { "name": "mkt" }
}
]
结果数组
[
{
"Prod": { "e-depid": ["ab", "ac"] },
"mkt": { "e-depid": ["ad"] }
}
]
您可以 .transform
获得想要的结果。
如有必要,将对象包装在数组中。
const
data = [{ id: "67", empid: 5, "e-depid": "ab", dept: { name: "Prod" } }, { id: "67", empid: 7, "e-depid": "ac", dept: { name: "Prod" } }, { id: "67", empid: 5, "e-depid": "ad", dept: { name: "mkt" } }],
result = _(data)
.groupBy(o => o.dept.name)
.transform((o, a, k) => (o[k] ??= {})['e-depid'] = a.map(o => o['e-depid']))
.value();
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
可以通过简单的 Array.prototype.reduce()
调用非常干净。
const
input = [{ "id": "67", "empid": 5, "e-depid": "ab", "dept": { "name": "Prod" } }, { "id": "67", "empid": 7, "e-depid": "ac", "dept": { "name": "Prod" } }, { "id": "67", "empid": 5, "e-depid": "ad", "dept": { "name": "mkt" } }],
result = input.reduce((a, { dept: { name }, 'e-depid': e }) => (
(a[name] || (a[name] = { 'e-depid': [] }))['e-depid'].push(e), a
), {});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
原始答案使用 logical nullish assignment (??=)
const
input = [{ "id": "67", "empid": 5, "e-depid": "ab", "dept": { "name": "Prod" } }, { "id": "67", "empid": 7, "e-depid": "ac", "dept": { "name": "Prod" } }, { "id": "67", "empid": 5, "e-depid": "ad", "dept": { "name": "mkt" } }],
result = input.reduce((a, { dept: { name }, 'e-depid': e }) => (
(a[name] ??= { 'e-depid': [] })['e-depid'].push(e), a
), {})
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
下面是主数组,我想按 dept.name 分组并将除“e-depid”之外的所有其他字段删除到单个数组
主数组
[
{
"id": "67",
"empid": 5,
"e-depid": "ab",
"dept": { "name": "Prod" }
},
{
"id": "67",
"empid": 7,
"e-depid": "ac",
"dept": { "name": "Prod" }
},
{
"id": "67",
"empid": 5,
"e-depid": "ad",
"dept": { "name": "mkt" }
}
]
结果数组
[
{
"Prod": { "e-depid": ["ab", "ac"] },
"mkt": { "e-depid": ["ad"] }
}
]
您可以 .transform
获得想要的结果。
如有必要,将对象包装在数组中。
const
data = [{ id: "67", empid: 5, "e-depid": "ab", dept: { name: "Prod" } }, { id: "67", empid: 7, "e-depid": "ac", dept: { name: "Prod" } }, { id: "67", empid: 5, "e-depid": "ad", dept: { name: "mkt" } }],
result = _(data)
.groupBy(o => o.dept.name)
.transform((o, a, k) => (o[k] ??= {})['e-depid'] = a.map(o => o['e-depid']))
.value();
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
可以通过简单的 Array.prototype.reduce()
调用非常干净。
const
input = [{ "id": "67", "empid": 5, "e-depid": "ab", "dept": { "name": "Prod" } }, { "id": "67", "empid": 7, "e-depid": "ac", "dept": { "name": "Prod" } }, { "id": "67", "empid": 5, "e-depid": "ad", "dept": { "name": "mkt" } }],
result = input.reduce((a, { dept: { name }, 'e-depid': e }) => (
(a[name] || (a[name] = { 'e-depid': [] }))['e-depid'].push(e), a
), {});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
原始答案使用 logical nullish assignment (??=)
const
input = [{ "id": "67", "empid": 5, "e-depid": "ab", "dept": { "name": "Prod" } }, { "id": "67", "empid": 7, "e-depid": "ac", "dept": { "name": "Prod" } }, { "id": "67", "empid": 5, "e-depid": "ad", "dept": { "name": "mkt" } }],
result = input.reduce((a, { dept: { name }, 'e-depid': e }) => (
(a[name] ??= { 'e-depid': [] })['e-depid'].push(e), a
), {})
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }