javascript - 排列 json 以匹配另一个 json 模板

标签 javascript arrays node.js json

我收到第一个 JSON,我想更改其结构,以便它与我的第二个 JSON 模板匹配

这是 JSON link我想将其格式化为 this

这是我到目前为止所做的:

for(i=0;i<json.option.length;i++)
{
    var row=json.option[i];

    if(!option.includes(row.option.option_id))
    {
        option.push({
            option_id:row.option.option_id,
            option_name:row.option.option_name,
            max:row.option.max,
            min:row.option.min,
            value:row.option.value,
            price:row.option.price
        })
    }


    if(!option_group.includes(row.option_group_id))
    {
        option_group.push({
            option_group_id:row.option_group_id,
            option_group_name:row.option_group_name,
            max:row.max,
            min:row.min,
            option:option
        })
    }
}

当第一个 JSON option.option_group_id 已经存在于数组中时,就会出现问题,它将不再添加任何对象。有办法做到这一点吗?

最佳答案

这是一个使用 Ramda.js 的解决方案

const data =  {
    item_id: 1065,
    item_name: "Drink",
    item_price: 1,
    option: [
        {
            max: 1,
            min: 1,
            option: {
                max: 1,
                min: 0,
                option_id: 3426,
                option_name: "Small",
                price: 0,
                value: 1
            },
            option_group_id: "drink_size",
            option_group_name: "Size"
        },
        {
            max: 1,
            min: 1,
            option: {
                max: 1,
                min: 0,
                option_id: 3426,
                option_name: "Medium",
                price: 0,
                value: 1
            },
            option_group_id: "drink_size",
            option_group_name: "Size"
        },
        {
            max: 1,
            min: 1,
            option: {
                max: 1,
                min: 0,
                option_id: 3426,
                option_name: "Large",
                price: 0,
                value: 1
            },
            option_group_id: "drink_size",
            option_group_name: "Size"
        },
        {
            max: 5,
            min: 0,
            option: {
                max: 1,
                min: 0,
                option_id: 3580,
                option_name: "Decaf",
                price: 0,
                value: 1
            },
            option_group_id: "coffee_extras",
            option_group_name: "Extras"
        },
        {
            max: 5,
            min: 0,
            option: {
                max: 1,
                min: 0,
                option_id: 3581,
                option_name: "Espresso Shot",
                price: 30,
                value: 1
            },
            option_group_id: "coffee_extras",
            option_group_name: "Extras"
        }
    ],
    quantity_value: 1
}


const transformGroup = (group) =>
  R.pipe(
    R.mergeAll,
    R.assoc("option", R.pluck("option", group))
  )(group)
  
const transformOption = (option) => 
  R.pipe(
    R.groupBy(R.prop("option_group_id")),
    R.map(transformGroup),
    R.values,
  )(option)

const transformData = (data) => 
  R.pipe(
    R.assoc("option_group", transformOption(data.option)),
    R.dissoc("option"),
  )(data)

console.log(transformData(data))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

关于javascript - 排列 json 以匹配另一个 json 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56470441/

相关文章:

javascript - D3JS中的自定义轴函数

java - 无法获取 JSON 对象类型数组

python - 一次删除多个数组中所有给定值的出现

java - 在 Java 中创建 Vector 的一部分

Node.js socket.io 函数不在服务器和客户端之间发送

node.js - 使用 npm 安装 express

javascript - 如何在javascript中获取隐藏列表的值

javascript - 获取所选元素的第 n 个子元素的数量

javascript - Angular 4 - 检测到循环依赖。两个组件导入了另一个组件的 .ts 文件

node.js - 使用node开发Json服务