【问题标题】:Regroup javascript array重新组合 javascript 数组
【发布时间】:2018-05-22 19:12:50
【问题描述】:

我想格式化:

[
    {
        "id": 1,
        "location": {
            "id": 1,
            "title": "location 1"
        },
    },
    {
        "id": 2,
        "location": {
            "id": 1,
            "title": "location 1"
        },
    },
    {
        "id": 3,
        "location": {
            "id": 2,
            "title": "location 2"
        },
    }
]

收件人:

[
    {
        "id": 1,
        "title": "location 1",
        "items": [
            {
                "id": 1
            },
            {
                "id": 2
            }
        ]
    },
    {   
        "id": 2,
        "title": "location 2",
        "items": [
            {
                "id": 3
            }
        ]
    }
]

更新: 根据您的回复,我得出:

const result = _(items)
    .groupBy(x => x.location.id)
    .map((value, key) => ({location: key, items: value}))
    .value();

这可行,但项目对象仍然包含位置属性,并且位置仅维护其 id 属性。是否需要将所有属性添加到 groupBy 中?

我这样做的原因是因为我想过滤项目属性,但显示按位置分组的项目。

【问题讨论】:

  • 你有什么尝试吗?我看到了 lodash 标签。
  • 请展示您尝试过的内容。 Stackoverflow 不是免费的代码编写服务
  • 嗨,Vincent,我想我之前也问过类似的问题,请查看:stackoverflow.com/questions/28220367/… 该问题与 underscore.js 有关,但也许它仍然有帮助。
  • 您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只会在发布者已经尝试自己解决问题时提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出以及您实际获得的输出(控制台输出、回溯等)。您提供的详细信息越多,您可能收到的答案就越多。检查FAQHow to Ask

标签: javascript json lodash


【解决方案1】:

location.title 上使用_.groupBy() 收集物品,然后使用map 他们。要创建一个对象,请使用location 的键(第二个参数),使用_.get() 从第一个项目中获取id,并使用@ 映射其他项目以仅获取没有title 的位置对象987654324@:

const data = [{"id":1,"location":{"id":1,"title":"location 1"}},{"id":2,"location":{"id":1,"title":"location 1"}},{"id":3,"location":{"id":2,"title":"location 2"}}];

const result = _(data)
  .groupBy('location.title')
  .map((items, location) => ({
    location,
    id: _.get(items, '[0].id'), // get the 1st item (if any) id
    items: items.map(({ location }) => _.omit(location, 'title')) // map the objects and take the inner item without the title
  }))
  .value();
  
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

【讨论】:

    【解决方案2】:

    替换以下代码

    const result = _(items)
        .groupBy(x => x.location.id)
        .map((value, key) => ({location: key, items: value}))
        .value();
    

    const result = _(items)
        .groupBy(x => x.location.id)
        .map((value, key) => ({location: key, items: value.map(e => ({id: e.id}))}))
        .value();
    

    【讨论】:

      猜你喜欢
      • 2016-05-27
      • 2022-01-14
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多