猿问

对嵌套对象数组进行分组

我有以下对象:


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"

                    }

                ]



如果结果没有意义,我可以解释更多。无论如何,我试图通过执行以下操作来尝试结果,但它没有按预期工作,我相信有一种更干净的方法可以做到这一点。


慕容森
浏览 104回答 3
3回答

qq_笑_17

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)

宝慕林4294392

使用更直接/原生的javascript对象形式,我能够使大多数部分更加离散。此代码通常假定对象可能没有给定索引的初始值,因此不会根据您似乎具有的初始化和将来假设仅使用这些索引的初始值执行任何优化。attribute.values[0]let newAttributes = {}; // will be converted backfor (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);

鸿蒙传说

我从头开始编写代码,它正在工作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} 
随时随地看视频慕课网APP

相关分类

Java
我要回答