使用 undescore.js,我试图将给定的输入格式化为预期的输出

Using undescore.js, i'm trying to format the given input to an expected output

输入:

    [{
    "dimensions": [{
            "name": "Size",
            "value": "Size1"
        },
        {
            "name": "Color",
            "value": "Color1"
        },
        {
            "name": "Pattern",
            "value": "1"
        }
    ],
    "link": "link",
    "title": "title"
},
{
    "dimensions": [{
            "name": "Size",
            "value": "Size2"
        },
        {
            "name": "Color",
            "value": "Color1"
        },
        {
            "name": "Pattern",
            "value": "2"
        }
    ],
    "link": "link1",
    "title": "title"
},
{
    "dimensions": [{
            "name": "Size",
            "value": "Size1"
        },
        {
            "name": "Color",
            "value": "Color2"
        },
        {
            "name": "Pattern",
            "value": "1"
        }
    ],
    "link": "link",
    "title": "title"
},
{
    "dimensions": [{
            "name": "Size",
            "value": "Size2"
        },
        {
            "name": "Color",
            "value": "Color1"
        },
        {
            "name": "Pattern",
            "value": "3"
        }
    ],
    "link": "link",
    "title": "title"
}]

预期输出:

    {
    "levels":3,
    "level_1_name":"Size",
    "level_2_name":"Color",
    "level_3_name":"Pattern",
    "data":[
       {
          "value":"Size1",
          "data":[
             {
                "value":"Color1",
                "data":[
                   {
                      "value":"1"
                   }
                ]
             }, {
                "value":"Color2",
                "data":[
                   {
                      "value":"4"
                   }
                ]
             }
          ]
       }, {
        "value":"Size2",
        "data":[
           {
              "value":"Color1",
              "data":[
                 {
                    "value":"3"
                 }
              ]
           },
           {
            "value":"Color2",
            "data":[
               {
                  "value":"2"
               }
            ]
         }
        ]
       }
    ]
 }

我试过类似的东西

for(index=0; index<data[0].dimensions.length - 1; index++) {
let temp = _(data).groupBy(function(o) {
    return o.dimensions[index].value
})
let keys = Object.keys(temp)
addData(final, keys, temp)
}
obj["data"] = final

function addData(data, keys, temp) {
if (data && data.length) {
    return data.forEach(function(data1){
        console.log(data1)
        return addData(data1, keys, temp)
    })
} else {
    let data_arr = []
    if (Array.isArray(data)) {
        keys.forEach(function(key) {
            data.push({
                value: key,
                data: temp[key]
            })
        })
    } else {
        keys.forEach(function(key) {
            let data_obj = {}
            data_obj['value'] = key
            data_obj['data'] = temp[key]
            data_arr.push(data_obj)
        })
        data["data"] = data_arr
    }
}
}

我已经尝试了按照预期输出格式化的逻辑。它适用于 2 级输入集,但编写的逻辑不适用于 3 级输入数据集。

此外,如果您能提出任何算法来解决这个问题,那将会很有帮助。

提前致谢!

这是一个使用 reduce() 的相当紧凑的解决方案。 (我已经编辑了输入以匹配您的预期输出。)

const source = [{
    "dimensions": [{
            "name": "Size",
            "value": "Size1"
        },
        {
            "name": "Color",
            "value": "Color1"
        },
        {
            "name": "Pattern",
            "value": "1"
        }
    ],
    "link": "link",
    "title": "title"
},
{
    "dimensions": [{
            "name": "Size",
            "value": "Size2"
        },
        {
            "name": "Color",
            "value": "Color2"
        },
        {
            "name": "Pattern",
            "value": "2"
        }
    ],
    "link": "link1",
    "title": "title"
},
{
    "dimensions": [{
            "name": "Size",
            "value": "Size1"
        },
        {
            "name": "Color",
            "value": "Color2"
        },
        {
            "name": "Pattern",
            "value": "4"
        }
    ],
    "link": "link",
    "title": "title"
},
{
    "dimensions": [{
            "name": "Size",
            "value": "Size2"
        },
        {
            "name": "Color",
            "value": "Color1"
        },
        {
            "name": "Pattern",
            "value": "3"
        }
    ],
    "link": "link",
    "title": "title"
}];

const output = source.reduce((acc, {dimensions: dims}) => {
  const levels = dims.length;

  // initialize top-level keys based on first object
  if (!acc.hasOwnProperty('levels')) {
    acc.levels = levels;
    dims.forEach((level, i) => acc[`level_${i+1}_name`] = level.name);
    acc.data = [];
  }

  // iterate over dimension objects and merge with accumulator
  let parent = acc.data;
  dims.forEach((o, i) => {
    let lvlObj = parent.find(e => e.value === o.value);
    if (!lvlObj) {
      lvlObj = i < levels - 1 ? 
        {value: o.value, data: []} :
        {value: o.value};
      parent.push({...lvlObj});
    }
    parent = lvlObj.data;
  });

  return acc;
}, {});

console.log(output);