javascript - 如何使用 Lodash 转换数据

标签 javascript collections lodash

我对 lodash 没有太多经验,我想转换我的数据。 我尝试使用 groupBy 和 map 但无法获得预期结果。 如果有人可以提供帮助,我将不胜感激。

示例数据

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);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

预期结果

var output = [
  {
    "type": "changeAccount",
    1: [{
      "updated": 'for changeType 1 under type changeAccount
    }],
    2: [{
      "updated": for changeType 2 under type changeAccount
    }]
  },

  {
    "type": "changeProduct",
    1: [{
      "updated": for changeType 1 under type changeProduct
    }]
  }
]

预期结果2

const sample2 = [
  {type:"changeAccount", changeType: [{1:[{updated}],{2:[{updated}]}}] 
]

最佳答案

您需要_.groupBy()类型,将项目映射到对象,并通过分组获取changeType属性再次通过 changeType,映射要更新的项目,并传播结果:

const { map, groupBy, mapValues, pick } = _

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
    ))
  }))

const 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}}]

const result = fn(sample)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

为了达到预期效果,您需要使用与 type 对象相同的逻辑:

const { map, groupBy, mapValues, pick } = _

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

const 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}}]

const result = fn(sample)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

关于javascript - 如何使用 Lodash 转换数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59274276/

相关文章:

javascript - 当我在 Amazon S3 中将 Quiet 设置为 true 以在 deleteObjects() 方法中启用安静模式时会发生什么?

函数内 while 循环内的 Javascript If 语句中断页面

list - Java 8 - 积累和创建新的集合

python - 'module'对象在pymongo中没有属性 'OrderedDict'错误

java - 我可以使用双循环来对列表进行排序吗?

javascript - 我可以使用 _lodash 在 AngularJS 中去抖动或限制监视的 &lt;input&gt; 吗?

javascript - Lodash:切片数组并保留特定项目

javascript - 使 Ideone API 在 Codeigniter 上工作(ajax、javascript、soapclient)

javascript - vscode 将行移到 block 快捷键上方

Javascript - 将多维数组与索引相结合