Как переместить элемент в другой массив на основе id_item - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть массив, но сейчас он все еще основан на id_order, например:

здесь мой контроллер

public function detail()
{
      $data = Order::with('detail')->get();
      return $data;
}

результат:

[
   {
     "id": 1, //id_order
     "order_number" : "IT.123.76",
     "status" : "Pending",
     "details" : [
                    { 
                       "id" : 1,
                       "id_order" : 1,
                       "id_item" : 2, //based from this
                       "name" : "Avocado Juice",
                       "qty" : 7
                    },
                    { 
                       "id" : 2,
                       "id_order" : 1,
                       "id_item" : 3, //based from this
                       "name" : "Orange Juice",
                       "qty" : 2
                    },
                    { 
                       "id" : 3,
                       "id_order" : 1,
                       "id_item" : 5, //based from this
                       "name" : "Mango Juice",
                       "qty" : 1
                    }
                ]
     },
     {
     "id": 2, //id_order
     "order_number" : "IT.123.78",
     "status" : "Pending",
     "details" : [
                    { 
                       "id" : 4,
                       "id_order" : 2,
                       "id_item" : 2, //based from this
                       "name" : "Avocado Juice",
                       "qty" : 1
                    },
                    { 
                       "id" : 5,
                       "id_order" : 2,
                       "id_item" : 9, //based from this
                       "name" : "Ice Tea",
                       "qty" : 2
                    }
                ]
         }

    }
]

Как изменить структуру массива так, чтобы она была такой (на основе id_item и элемента name становится ключом в каждом элементе), а также для qty каждого элемента, например, = сок авокадо имеет 2 порядка, первый порядок имеет qty: 7 и второй порядок Кол-во: 1, затем суммирует 8 результатов?

[
  {
   "qty_total" : 8, // from 7+1 in avocado juice
   "Avocado Juice" : [
                        {
                           "id" : 1, //From id_order
                           "id_item" : 2, //Avocado Juice
                           "order_number" : "IT.123.76",
                           "qty" : 7
                        },
                        {
                           "id" : 2, //From id_order
                           "id_item" : 2, //Avocado Juice
                           "order_number" : "IT.123.78",
                           "qty" : 1
                        }
                ]
   },
   {
    "qty_total" : 2,
    "Orange Juice" : [
                        {
                           "id" : 1, //From id_order
                           "id_item" : 3, //Orange Juice
                           "order_number" : "IT.123.76",
                           "qty" : 2
                        }
                   ]
   },
   {
    "qty_total" : 1,
    "Mango Juice" : [
                        {
                           "id" : 2, //From id_order
                           "id_item" : 5, //Mango Juice
                           "order_number" : "IT.123.76", //order_number Id_order 1
                           "qty" : 1
                        }
                   ]
   },
   {
    "qty_total" : 2,
    "Ice Tea" : [
                        {
                           "id" : 1, //From id_order
                           "id_item" : 9, //Ice Tea
                           "order_number" : "IT.123.78",
                           "qty" : 2
                        }
                   ]
   },
]

Спасибо за продвижение

1 Ответ

1 голос
/ 16 апреля 2020

Вы можете попробовать что-то вроде этого.

const orders = [
    {
        "id": 1, //id_order
        "order_number": "IT.123.76",
        "status": "Pending",
        "details": [
            {
                "id": 1,
                "id_order": 1,
                "id_item": 2, //based from this
                "name": "Avocado Juice",
                "qty": 7
            },
            {
                "id": 2,
                "id_order": 1,
                "id_item": 3, //based from this
                "name": "Orange Juice",
                "qty": 2
            },
            {
                "id": 3,
                "id_order": 1,
                "id_item": 5, //based from this
                "name": "Mango Juice",
                "qty": 1
            }
        ]
    }, {
        "id": 2,
        "order_number": "IT.123.78",
        "status": "Pending",
        "details": [
            {
                "id": 4,
                "id_order": 2,
                "id_item": 2, //based from this
                "name": "Avocado Juice",
                "qty": 1
            },
            {
                "id": 5,
                "id_order": 2,
                "id_item": 9, //based from this
                "name": "Ice Tea",
                "qty": 2
            }
        ]
    }
];
var ordersById = {};
orders.forEach((order) => {
  order.details.forEach((detail) => {
      // ToDo: filter out completed/nonpending orders
      let orderGroup;
      
      if (!ordersById[detail.id_item]) {
        orderGroup = {qty_total: detail.qty};
        orderGroup[detail.name] = [{id: detail.id_order, id_item: detail.id_item, order_number: order.order_number, qty: detail.qty}];
        ordersById[detail.id_item] = orderGroup;
      } else {
        orderGroup = ordersById[detail.id_item];
        orderGroup.qty_total += detail.qty;
        orderGroup[detail.name].push([{id: detail.id_order, id_item: detail.id_item, order_number: order.order_number, qty: detail.qty}]);
      }
  });
});

const result = Object.keys(ordersById).map((order_id) => { return ordersById[order_id];});;

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...