JS库将JSON重复数据转换为对象数组

时间:2018-10-13 14:00:12

标签: javascript json

我知道我想要实现的目标,但是不知道如何用简短的表达方式以及如何找到想要的东西,因此我将尝试描述,也许有人会指出我正确的道路。 / 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库可以仅使用您提供给它的数据来执行此操作?

3 个答案:

答案 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>