为了账号安全,请及时绑定邮箱和手机立即绑定

对嵌套对象数组进行分组

对嵌套对象数组进行分组

慕容森 2022-08-18 09:47:35
我有以下对象:const attributes = [    {        id: "a",        values: [            {                value: [                    {                        _id: "aa",                        value: "1500"                    },                    {                        _id: "ab",                        value: "580"                    }                ]            },            {                value: [                    {                        _id: "aa",                        value: "400"                    }                ]            }        ]    },    {        id: "a",        values: [            {                value: [                    {                        _id: "aa",                        value: "420"                    },                    {                        _id: "ab",                        value: "300"                    }                ]            },            {                value: [                    {                        _id: "aa",                        value: "480"                    },                    {                        _id: "ab",                        value: "1000"                    }                ]            },            {                value: [                    {                        _id: "aa",                        value: "880"                    },                    {                        _id: "ab",                        value: "740"                    }                ]            }        ]    },    {        id: "b",        values: [            {                value: [                    {                        _id: "ba",                        value: "1500"                    },                    {                        _id: "bb",                        value: "580"                    }                ]如果结果没有意义,我可以解释更多。无论如何,我试图通过执行以下操作来尝试结果,但它没有按预期工作,我相信有一种更干净的方法可以做到这一点。
查看完整描述

3 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

const attributes = [

    {

        id: "a",

        values: [

            {

                value: [

                    {

                        _id: "aa",

                        value: "1500"

                    },

                    {

                        _id: "ab",

                        value: "580"

                    }

                ]

            },

            {

                value: [

                    {

                        _id: "aa",

                        value: "400"

                    }

                ]

            }

        ]

    },

    {

        id: "a",

        values: [

            {

                value: [

                    {

                        _id: "aa",

                        value: "420"

                    },

                    {

                        _id: "ab",

                        value: "300"

                    }

                ]

            },

            {

                value: [

                    {

                        _id: "aa",

                        value: "480"

                    },

                    {

                        _id: "ab",

                        value: "1000"

                    }

                ]

            },

            {

                value: [

                    {

                        _id: "aa",

                        value: "880"

                    },

                    {

                        _id: "ab",

                        value: "740"

                    }

                ]

            }

        ]

    },

    {

        id: "b",

        values: [

            {

                value: [

                    {

                        _id: "ba",

                        value: "1500"

                    },

                    {

                        _id: "bb",

                        value: "580"

                    }

                ]

            },

            {

                value: [

                    {

                        _id: "ba",

                        value: "400"

                    }

                ]

            }

        ]

    },

];


let newStructure = 

    attributes.map(attr => {

        let tempValues = {};

        attr.values.forEach((value, index)=> { 

            value.value.forEach((v)=>{

                if(typeof tempValues[v._id] == "undefined")

                    tempValues[v._id] = 0;

                tempValues[v._id] += +v.value


            })

        })

        return {

            id: attr.id,

            values: tempValues

        }


}).reduce((accumulator, currentValue)=>{

    if(typeof accumulator[currentValue.id] == "undefined")

        accumulator[currentValue.id] = { id: currentValue.id, values: {} };

    Object.keys(currentValue.values).forEach( valueKey =>{

        if(typeof accumulator[currentValue.id].values[valueKey] == "undefined")

                accumulator[currentValue.id].values[valueKey] = [currentValue.values[valueKey]];

        else

                accumulator[currentValue.id].values[valueKey].push(currentValue.values[valueKey]);

    })

    

    return accumulator

},{})


newStructure = Object.keys(newStructure).map(itemKey => {

    return {

        id: itemKey,

        values: {

            value: Object.keys(newStructure[itemKey].values).map(valueKey => {

                return  {

                    _id: valueKey,

                    value: newStructure[itemKey].values[valueKey]

                }

            })

        }

    }

});


console.log(newStructure)


查看完整回答
反对 回复 2022-08-18
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

使用更直接/原生的javascript对象形式,我能够使大多数部分更加离散。此代码通常假定对象可能没有给定索引的初始值,因此不会根据您似乎具有的初始化和将来假设仅使用这些索引的初始值执行任何优化。attribute.values[0]


let newAttributes = {}; // will be converted back

for (attribute of attributes){


    let newValues = []; // turn it into [ { "aa":1500, "ab":580 }, {"aa":400} ]

    for (valueSet of attribute.values){

        let newObj = {};

        for (value of valueSet.value){

            newObj[value._id] = Number(value.value);

        }

        newValues.push(newObj);

    }


    let sum = {};

    for (value of newValues){

        for (id in value){

            if (!(id in sum)) sum[id] = 0;

            sum[id] += value[id];

        }

    }


    if ( !(attribute.id in newAttributes))

        newAttributes[attribute.id] = {};


    outAttrib = newAttributes[attribute.id]

    for (id in sum){

        if ( !(id in outAttrib)) outAttrib[id] = [];

        outAttrib[id].push(sum[id].toString());

    }


}

// at this point, the object would be in, imo, more manageable form

// a: { aa: [ '1900', '1780' ], ab: [ '580', '2040' ] },

// b: { ba: [ '1900' ], bb: [ '580' ] }


let out = [];

for (id in newAttributes){ // can be integrated into former loop but I think this makes more sense

    let value = [];

    for (_id in newAttributes[id]){

        value.push({_id: _id, values: newAttributes[id][_id]});

    }

    out.push({id: id, values: [ { value: value } ] });

}

console.log(out);


查看完整回答
反对 回复 2022-08-18
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

我从头开始编写代码,它正在工作


const attributes = [

  {

      id: "a",

      values: [

          {

              value: [

                  {

                      _id: "aa",

                      value: "1500"

                  },

                  {

                      _id: "ab",

                      value: "580"

                  }

              ]

          },

          {

              value: [

                  {

                      _id: "aa",

                      value: "400"

                  }

              ]

          }

      ]

  },

  {

      id: "a",

      values: [

          {

              value: [

                  {

                      _id: "aa",

                      value: "420"

                  },

                  {

                      _id: "ab",

                      value: "300"

                  }

              ]

          },

          {

              value: [

                  {

                      _id: "aa",

                      value: "480"

                  },

                  {

                      _id: "ab",

                      value: "1000"

                  }

              ]

          },

          {

              value: [

                  {

                      _id: "aa",

                      value: "880"

                  },

                  {

                      _id: "ab",

                      value: "740"

                  }

              ]

          }

      ]

  },

  {

      id: "b",

      values: [

          {

              value: [

                  {

                      _id: "ba",

                      value: "1500"

                  },

                  {

                      _id: "bb",

                      value: "580"

                  }

              ]

          },

          {

              value: [

                  {

                      _id: "ba",

                      value: "400"

                  }

              ]

          }

      ]

  },

];


newAttributes = [];

attributes.forEach(attribute => {

  childOutput = childNode(attribute.values)


  var isIdPresent = newAttributes.filter(e => {

    return  e.id == attribute.id

  });


  if (isIdPresent.length > 0) {

    var parentNode = isIdPresent[0]

    newAttributes = newAttributes.filter(e => {

      return  e.id != attribute.id

    });

    parentNode["values"][0].value = (mergeChildNode(parentNode["values"][0].value, childOutput))

    newAttributes.push(parentNode)

  } else {

    var parentNode ={}

    parentNode["id"] = attribute.id

    parentNode["values"] = [{value:[]}]

    parentNode["values"][0].value = (mergeChildNode(parentNode["values"][0].value, childOutput))

    newAttributes.push(parentNode)

  }

});


console.log(JSON.stringify(newAttributes));



function childNode(attrValues){

  childOutput = {}

  attrValues.forEach(valueArray => {

    valueArray.value.forEach(valueObj => {

      if (childOutput.hasOwnProperty(valueObj._id)) {

        childOutput[valueObj._id] = childOutput[valueObj._id] + parseInt(valueObj.value)

      } else {

        childOutput[valueObj._id] = parseInt(valueObj.value)

      }

    });

  });

  return childOutput

}


function mergeChildNode (inputArray, childOutput) {

  for (const property in childOutput) {

    var isIdPresent = inputArray.filter(e => {

      return  e._id == property

    });


    if (isIdPresent.length > 0) {

      var newObj = isIdPresent[0];

      inputArray = inputArray.filter(e => {

        return  e._id != property

      });

      newObj["values"].push(childOutput[property])

      inputArray.push(newObj)

    } else {

      inputArray.push({

        _id: property,

        values: [childOutput[property]]

      })

    }

  }

  return inputArray


查看完整回答
反对 回复 2022-08-18
  • 3 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信