首页 > 解决方案 > 数组如何在java脚本中分组

问题描述

嗨,我是 java 脚本的新手,我正在使用 knex ORM 与数据库进行交互,我得到了平缓的 json 作为结果行,我需要以我在预期结果中提到的实际格式获得结果。我尝试了一些代码,但没有一个代码给我预期的结果。我已经提到了我尝试过的原型代码以及代码的结果,它不是我想要的格式我怎样才能获得我在预期结果部分中提到的实际结果,我如何使用 lodash 或 ES6 来实现相同的结果高阶函数。

var data= [
    {order_id: 1,kot_id: 10,price: 20,quantity: 2},
    {order_id: 1,kot_id: 10,price: 100,quantity: 1},
    {order_id: 1,kot_id: 10,price: 150,quantity: 1},
    {order_id: 1,kot_id: 11,price: 55,quantity: 1},
    {order_id: 1,kot_id: 11,price: 250,quantity: 3},
]



let objects = {}
let arr = []
result = data.forEach((item,index) => {
    if(!objects.order_id) {
        objects = {order_id: item.order_id,list: []}
        arr.push(objects)
    }
    if(!objects.kot_id) {
         objects.list.push({kot_id: item.kot_id,kot_list: []})

    }
    objects.list[index].kot_list.push({price: item.price,quantity: item.quantity})

})
console.log(JSON.stringify(arr,null,2))

RESULT OF THE ABOVE CODE
[

  {
    "order_id": 1,
    "list": [
      {
        "kot_id": 10,
        "kot_list": [
          {
            "price": 20,
            "quantity": 2
          }
        ]
      },
      {
        "kot_id": 10,
        "kot_list": [
          {
            "price": 100,
            "quantity": 1
          }
        ]
      },
      {
        "kot_id": 10,
        "kot_list": [
          {
            "price": 150,
            "quantity": 1
          }
        ]
      },
      {
        "kot_id": 11,
        "kot_list": [
          {
            "price": 55,
            "quantity": 1
          }
        ]
      },
      {
        "kot_id": 11,
        "kot_list": [
          {
            "price": 250,
            "quantity": 3
          },

        ]
      }
    ]
  }
]

EXPECTED RESULT

result = [
    {
        order_id: 1,
        list: [
            {
                kot_id: 10,
                kot_list : [
                    { price: 200,quantity: 2 },
                    {price: 100,quantity: 1},
                    {price: 150,quantity: 1}
                ]
            },
            {
                kot_id: 11,
                kot_list: [
                    {price: 55,quantity: 1},
                    {price: 250,quantity: 3}
                ]
            }
        ]
    }
]

标签: javascriptjson

解决方案


groupBymapValues这样的lodash实用程序应该可以完成这项工作。

洛达什示例:

const data = [
    {order_id: 1, kot_id: 10, price: 20, quantity: 2},
    {order_id: 1, kot_id: 10, price: 100, quantity: 1},
    {order_id: 1, kot_id: 10, price: 150, quantity: 1},
    {order_id: 1, kot_id: 11, price: 55, quantity: 1},
    {order_id: 1, kot_id: 11, price: 250, quantity: 3},

    {order_id: 2, kot_id: 10, price: 150, quantity: 1},
    {order_id: 2, kot_id: 11, price: 55, quantity: 1},
    {order_id: 2, kot_id: 11, price: 250, quantity: 3},
]


const result = _(data)
  .groupBy('order_id')
  .mapValues((values, key) => {
    return _(values)
      .groupBy('kot_id')
      .map((list, id) => ({
        kot_id: id,
        kot_list: _.map(list, i => _.pick(i, ['price', 'quantity']))
      }))
      .value();
  })
  .map((list, order_id) => ({order_id, list}))
  .value();


console.log(JSON.stringify(result, null, 4));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

或者您可以简单地使用 ES6 实用程序来实现相同的结果:

简单的 ES6 示例:

const data = [
    {order_id: 1, kot_id: 10, price: 20, quantity: 2},
    {order_id: 1, kot_id: 10, price: 100, quantity: 1},
    {order_id: 1, kot_id: 10, price: 150, quantity: 1},
    {order_id: 1, kot_id: 11, price: 55, quantity: 1},
    {order_id: 1, kot_id: 11, price: 250, quantity: 3},

    {order_id: 2, kot_id: 10, price: 150, quantity: 1},
    {order_id: 2, kot_id: 11, price: 55, quantity: 1},
    {order_id: 2, kot_id: 11, price: 250, quantity: 3},
]


const orderIds = [...new Set(data.map(i => i.order_id))];
const kotIds = [... new Set(data.map(i => i.kot_id))];

const result = orderIds.map(order_id => {
  return {
    order_id,
    list: kotIds
      .map(kot_id => {
        return {
          kot_id,
          kot_list: data
            .filter(i => i.order_id === order_id && i.kot_id === kot_id)
            .map(i => ({price: i.price, quantity: i.quantity}))
        }
      })
  };
});

console.log(JSON.stringify(result, null, 4));


推荐阅读