gpt4 book ai didi

javascript - 使用 lodash 将数据转换为对象属性而不是集合

转载 作者:行者123 更新时间:2023-11-28 16:55:00 25 4
gpt4 key购买 nike

跟进我之前关于使用 lodash 转换数据的问题,这次我要求输出是对象属性而不是集合。我感谢您的帮助,如果有人也可以指导我从哪里正确开始,以便我更好地理解这些概念

示例数据

var sample = [{
"changeType": 1,
"type": "changeAccount",
"updated": {
"id": 71,
"company": 124201,
"user": 8622
}
},
{
"changeType": 2,
"type": "changeAccount",
"updated": {
"id": 70,
"company": 124201,
"user": 8622
}
},
{
"changeType": 1,
"type": "changeproduct",
"updated": {
"id": 15,
"company": 124201,
"user": 8622
}
}
]

// what I tried
var result = _.mapValues(_.groupBy(sample, "type"), x => x.map(y => _.omit(y, "changeType")));

console.log(result);

预期结果

var output = {
"ChangeAccount": {

"changeTypes":
{
"add": [{}], //type 1

"remove": [{}] //type 2


}
},

"ChangeProduct":{

"changeTypes":
{
"add": [{}], //type 1

"remove": [{}] //type 2 will be empty in this case
}
}
}

上一个问题的答案

const fn = arr =>
map(groupBy(arr, 'type'), (group, type) => ({ // group and map to array of objects
type,
...mapValues( // spread after mapping the values to extract updated
groupBy(group, 'changeType'), // group again by changeType
items => items.map(item => pick(item, 'updated') // extract the updated from each item
))
}))

**上一个答案输出**

 [
{
[
{
"updated": {
"id": 71,
"company": 124201,
"user": 8622
}
}
],
[
{
"updated": {
"id": 70,
"company": 124201,
"user": 8622
}
}
],
"type": "changeAccount"
},
{
[
{
"updated": {
"id": 15,
"company": 124201,
"user": 8622
}
}
],
"type": "changeproduct"
}

最佳答案

我想说的是,你并不是被迫使用 lodash,你可以用简单的 javascript 来实现这一点。但是,由于您需要使用 lodash,这里有一个简单的方法。您可以根据您的要求的难易程度来简化它。

const omitChangeType = ({changeType, ...rest}) => rest // this is just ES6, don't need lodash for this

_.mapValues(
_.groupBy(sample, "type"),
(x) => ({
changeTypes: {
add: x.filter(_.matches({ changeType: 1 })).map(omitChangeType),
remove: x.filter(_.matches({ changeType: 2 })).map(omitChangeType)
}})
)

我喜欢这个解决方案的地方在于,您可以了解最终结构的外观。

输出:

{
"changeAccount": {
"changeTypes": {
"add": [
{
"type": "changeAccount",
"updated": {
"id": 71,
"company": 124201,
"user": 8622
}
}
],
"remove": [
{
"type": "changeAccount",
"updated": {
"id": 70,
"company": 124201,
"user": 8622
}
}
]
}
},
"changeproduct": {
"changeTypes": {
"add": [
{
"type": "changeproduct",
"updated": {
"id": 15,
"company": 124201,
"user": 8622
}
}
],
"remove": []
}
}
}

在我的解决方案中,我使用了一些 ES 解构,如果您要处理这样的数据修改,这是一个非常方便的功能。 Take a look at this if你不熟悉它。另外,我不确定您的意图是否只是省略changeType,或者您是否想提取每个对象的更新部分。如果您只想选择每个对象的更新属性,只需通过以下函数名称更改每个外观,并添加此函数声明:

const pickUpdated = ({updated}) => updated

所以代替 .map(omitChangeType)你做.map(pickUpdated)

在这种情况下,输出将如下所示

{
"changeAccount": {
"changeTypes": {
"add": [
{
"id": 71,
"company": 124201,
"user": 8622
}
],
"remove": [
{
"id": 70,
"company": 124201,
"user": 8622
}
]
}
},
"changeproduct": {
"changeTypes": {
"add": [
{
"id": 15,
"company": 124201,
"user": 8622
}
],
"remove": []
}
}
}

如有任何疑问,请随时发表评论

关于javascript - 使用 lodash 将数据转换为对象属性而不是集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59378506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com