javascript - lodash 从对象数组中查找公共值
问题描述
从 Array of Objects 中查找公共值并传送它们
尝试使用 lodash groupBy
var data =[
{
"dc": 1,
"effDate": "1/2/2019",
"expDate": "1/2/2019",
"rate": 1,
"minCharge": 2
},
{
"dc": 1,
"effDate": "1/2/2019",
"expDate": "1/2/2019",
"rate": 2,
"minCharge": 6
},
{
"dc": 1,
"effDate": "1/2/2019",
"expDate": "1/2/2019",
"rate": 4,
"minCharge": 7
}
]
var expectedResult=[
{
"dc": 1,
"effDate": "1/2/2019",
"expDate": "1/2/2019",
"rateCharge": [
{
"rate": 1,
"minCharge": 2
},
{
"rate": 2,
"minCharge": 6
},
{
"rate": 4,
"minCharge": 7
}
]
}
]
在数据 dc、effDate、expDate 中是相同的,所以我需要将常见的东西保持为扁平结构并将重复项移动到 rateCharge 中。
var expectedResult=uniqBy(data,(val1.rate,val2.rate) => {
val1.rate!=val2.rate;
});
我尝试使用 lodash uniqBy 属性,但没有得到预期的结果。
解决方案
您需要按 对项目进行分组effDate
,然后使用_.pick()
/ _.omit()
、将组映射到所需的形式_.map()
,并使用_.uniqBy()
作为rate
唯一标识符。
Typescript 示例(打开浏览器控制台)
const { flow, partialRight: pr, groupBy, map, head, pick, omit, uniqBy } = _
const EFF_DATA = 'effDate'
const baseProps = ['dc', EFF_DATA, 'expDate']
const fn = flow(
pr(groupBy, EFF_DATA),
pr(map, g => ({
...pick(head(g), baseProps),
rateCharge: uniqBy(map(g, pr(omit, baseProps)), 'rate')
}))
)
const data = [{"dc":1,"effDate":"1/2/2019","expDate":"1/2/2019","rate":1,"minCharge":2},{"dc":1,"effDate":"1/2/2019","expDate":"1/2/2019","rate":2,"minCharge":6},{"dc":1,"effDate":"1/2/2019","expDate":"1/2/2019","rate":4,"minCharge":7}]
const result = fn(data)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
如果你已经导入了整个 lodash 包,你可以使用链接:
const { flow, partialRight: pr, groupBy, map, head, pick, omit, uniqBy } = _
const EFF_DATA = 'effDate'
const baseProps = ['dc', EFF_DATA, 'expDate']
const data = [{"dc":1,"effDate":"1/2/2019","expDate":"1/2/2019","rate":1,"minCharge":2},{"dc":1,"effDate":"1/2/2019","expDate":"1/2/2019","rate":2,"minCharge":6},{"dc":1,"effDate":"1/2/2019","expDate":"1/2/2019","rate":4,"minCharge":7}]
const result = _(data)
.groupBy(EFF_DATA)
.map(g => ({
...pick(head(g), baseProps),
rateCharge: uniqBy(map(g, pr(omit, baseProps)), 'rate')
}));
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
和 lodash/fp 版本:
const { flow, groupBy, map, head, pick, omit, uniqBy, assoc } = _;
const EFF_DATA = 'effDate'
const baseProps = ['dc', EFF_DATA, 'expDate'];
const fn = flow(
groupBy(EFF_DATA),
map(g => assoc(
'rateCharge',
flow(map(omit(baseProps)), uniqBy('rate'))(g),
pick(baseProps, head(g))
))
)
const data = [{"dc":1,"effDate":"1/2/2019","expDate":"1/2/2019","rate":1,"minCharge":2},{"dc":1,"effDate":"1/2/2019","expDate":"1/2/2019","rate":2,"minCharge":6},{"dc":1,"effDate":"1/2/2019","expDate":"1/2/2019","rate":4,"minCharge":7}]
const result = fn(data)
console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
推荐阅读
- java - Getting a ClassNotFoundException when starting Tomcat 9 after upgrading to Java 11
- javascript - How to rename files in Google Script conditioned to something
- javascript - 将额外的页面推送到历史记录
- jquery - 如何使用 select_tag 在 Rails + jQuery 组合中避免奇怪的行为
- mysql - 为简单的三表模式优化 MySQL LEFT JOIN 查询?
- c - 在一个循环中使用 2 个变量对数组求和(并运行循环 N/2 次)比仅一个变量提供更快的运行时间。为什么?
- c# - ServiceStack.Text 5.4.0版默认char值序列化和反序列化
- ios - 链接在 v2.0 API - 如何获取虚名或公共个人资料网址?
- mysql - MySQL 5.5 - 如何从具有重复字符串的字段中提取部分文本?
- image-processing - 应该使用哪种过滤器来查找此图像中的对象?