3 回答
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)
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);
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
}
添加回答
举报