-
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}