我知道我想要实现的目标,但是不知道如何用简短的表达方式以及如何找到想要的东西,因此我将尝试描述,也许有人会指出我正确的道路。 / p>
我想从结果转换为仅包含一个唯一的对象,该对象根据对象属性的名称嵌套到对象数组中。例如,我想对此进行转换:
[
{ "id": 1, "name": "Mister", "surname": "X", "order.id": 1, "orders.item_id": 3, "orders.delivered": true },
{ "id": 1, "name": "Mister", "surname": "X", "order.id": 2, "orders.item_id": 5, "orders.delivered": true },
{ "id": 2, "name": "Missis", "surname": "X", "order.id": 3, "orders.item_id": 7, "orders.delivered": true },
{ "id": 2, "name": "Missis", "surname": "X", "order.id": 4, "orders.item_id": 6, "orders.delivered": true }
]
进入
[
{ "id": 1, "name": "Mister", "surname": "X", "orders": [
{ "id": 1, "item_id": 3, "delivered": true },
{ "id": 2, "item_id": 5, "delivered": true }
]},
{ "id": 2, "name": "Missis", "surname": "X", "orders": [
{ "id": 3, "item_id": 7, "delivered": true },
{ "id": 4, "item_id": 6, "delivered": true }
] }
]
数据本身并不是需要转换的对象,可能还有其他字段,这就是为什么可以嵌套的数据是前缀名称orders
与带点的连接列名称分开的原因。对象属性可以有多少嵌套是没有限制的,例如甚至可以是orders.items.tags.name
。我需要在Javascript
中完成此操作。我不要ORM。我想对已有的JSON数据执行这些操作。
也许这样的动作/数据转换有它的名字,我可以自己查找库?是否有Javascript库可以仅使用您提供给它的数据来执行此操作?
答案 0 :(得分:1)
这是使用reduce
获得所需输出的一种方法。它产生一个带有代表主id
的键的对象(因为使用对象数组更容易使用该键),并假定将顺序键重命名为可通过解构使用的东西:
const data = [
{ id: 1, name: "Mister", surname: "X", orders_id: 1, item_id: 3, delivered: true },
{ id: 1, name: "Mister", surname: "X", orders_id: 2, item_id: 5, delivered: true },
{ id: 2, name: "Missis", surname: "X", orders_id: 3, item_id: 7, delivered: true },
{ id: 2, name: "Missis", surname: "X", orders_id: 4, item_id: 6, delivered: true }
];
function transform(arr) {
return arr.reduce((obj, c) => {
// destructure the current object
const { id, name, surname, ...order } = c;
// if the id doesn't already exist create a new one with an empty orders array
obj[id] = obj[id] || { name, surname, orders: [ ] };
// push the order into the array
obj[id].orders.push(order);
// return the object for the next iteration
return obj;
}, {});
}
const out = transform(data);
console.log(out);
答案 1 :(得分:1)
使用函数.m
对对象进行分组并使用函数.m
提取所需数组的替代方法。
reduce
Object.values
答案 2 :(得分:0)
您可以使用Array#reduce()创建一个groupBy对象映射,然后获取该对象的数组值作为结果
请注意,属性名称中不能使用点号
const grouped = data.reduce((map,{id,name,surname,...rest})=>{
!map.has(id) && map.set(id, {id, name, surname, orders:[]})
map.get(id).orders.push({...rest})
return map
},new Map);
const res = [...grouped.values()]
console.log(res)
<script>
const data = [
{ id: 1, name: "Mister", surname: "X", order_id: 1, item_id: 3, delivered: true },
{ id: 1, name: "Mister", surname: "X", order_id: 2, item_id: 5, delivered: true },
{ id: 2, name: "Missis", surname: "X", order_id: 3, item_id: 7, delivered: true },
{ id: 2, name: "Missis", surname: "X", order_id: 4, item_id: 6, delivered: true }
]
</script>