Javascript lodash - 基于属性值的数据按摩
Javascript lodash - data massaging based on attribute value
我有一个对象数组,例如:
var elements = [
{
LabCode: 'VA',
Zscore: 0.5,
Standard: 'std1'
},
{
LabCode: 'RE',
Zscore: 0.53,
Standard: 'std1'
},
{
LabCode: 'VO',
Zscore: 1.5,
Standard: 'std1'
},
{
LabCode: 'VA',
Zscore: 3.4,
Standard: 'std2'
},
{
LabCode: 'RE',
Zscore: 2.45,
Standard: 'std2'
},
{
LabCode: 'VO',
Zscore: 1.67,
Standard: 'std2'
}
]
我需要的是这个:
var result = [
{
Standard: 'std1',
VA: 0.5,
RE: 0.53,
VO: 1.5
},
{
Standard: 'std2',
VA: 3.4,
RE: 2.45,
VO: 1.67
}
]
Labcode 是动态的,因此我需要能够动态创建结果对象。我可以有很多标准,它们也是动态的。
我正在使用 lodash。
请注意 属性 名称需要反映 labcode 也是动态的这一事实。这在您记为重复的答案中没有解决。
你可以简单地用 reduce()
像这样
var elements = [
{LabCode: 'VA',Zscore: 0.5, Standard: 'std1' },
{LabCode: 'RE',Zscore: 0.53,Standard: 'std1' },
{LabCode: 'VO',Zscore: 1.5, Standard: 'std1' },
{LabCode: 'VA',Zscore: 3.4, Standard: 'std2' },
{LabCode: 'RE',Zscore: 2.45,Standard: 'std2' },
{LabCode: 'VO',Zscore: 1.67,Standard: 'std2' }
]
let final = Object.values(elements.reduce((op,cur)=>{
if( op[cur['Standard']] ) {
op[cur['Standard']][cur['LabCode']] = cur['Zscore']
} else {
op[cur['Standard']] = {
'Standard' : cur['Standard'],
[cur['LabCode']]: cur['Zscore']
}
}
return op;
}, {} ))
console.log(final);
如果是 IE,你可以使用这个。
var elements = [
{LabCode: 'VA',Zscore: 0.5, Standard: 'std1' },
{LabCode: 'RE',Zscore: 0.53,Standard: 'std1' },
{LabCode: 'VO',Zscore: 1.5, Standard: 'std1' },
{LabCode: 'VA',Zscore: 3.4, Standard: 'std2' },
{LabCode: 'RE',Zscore: 2.45,Standard: 'std2' },
{LabCode: 'VO',Zscore: 1.67,Standard: 'std2' }
]
let final = elements.reduce((op,cur)=>{
if( op[cur['Standard']] ) {
op[cur['Standard']][cur['LabCode']] = cur['Zscore']
} else {
op[cur['Standard']] = {
'Standard' : cur['Standard'],
[cur['LabCode']]: cur['Zscore']
}
}
return op;
}, {} )
let finalop = [];
for(let key in final){
finalop.push(final[key])
}
console.log(finalop);
你可以通过一个 Array.reduce
和一些 ES6(没有 lodash)来完成这个:
var data = [{ LabCode: 'VA', Zscore: 0.5, Standard: 'std1' }, { LabCode: 'RE', Zscore: 0.53, Standard: 'std1' }, { LabCode: 'VO', Zscore: 1.5, Standard: 'std1' }, { LabCode: 'VA', Zscore: 3.4, Standard: 'std2' }, { LabCode: 'RE', Zscore: 2.45, Standard: 'std2' }, { LabCode: 'VO', Zscore: 1.67, Standard: 'std2' } ]
const result = data.reduce((r, {LabCode, Zscore, Standard}, i, a) => {
r[Standard] = r[Standard] || {}
r[Standard][LabCode] = Zscore
return i == a.length-1 ? Object.keys(r).map(k => ({Standard: k, ...r[k]})) : r
}, {})
console.log(result)
我有一个对象数组,例如:
var elements = [
{
LabCode: 'VA',
Zscore: 0.5,
Standard: 'std1'
},
{
LabCode: 'RE',
Zscore: 0.53,
Standard: 'std1'
},
{
LabCode: 'VO',
Zscore: 1.5,
Standard: 'std1'
},
{
LabCode: 'VA',
Zscore: 3.4,
Standard: 'std2'
},
{
LabCode: 'RE',
Zscore: 2.45,
Standard: 'std2'
},
{
LabCode: 'VO',
Zscore: 1.67,
Standard: 'std2'
}
]
我需要的是这个:
var result = [
{
Standard: 'std1',
VA: 0.5,
RE: 0.53,
VO: 1.5
},
{
Standard: 'std2',
VA: 3.4,
RE: 2.45,
VO: 1.67
}
]
Labcode 是动态的,因此我需要能够动态创建结果对象。我可以有很多标准,它们也是动态的。
我正在使用 lodash。
请注意 属性 名称需要反映 labcode 也是动态的这一事实。这在您记为重复的答案中没有解决。
你可以简单地用 reduce()
像这样
var elements = [
{LabCode: 'VA',Zscore: 0.5, Standard: 'std1' },
{LabCode: 'RE',Zscore: 0.53,Standard: 'std1' },
{LabCode: 'VO',Zscore: 1.5, Standard: 'std1' },
{LabCode: 'VA',Zscore: 3.4, Standard: 'std2' },
{LabCode: 'RE',Zscore: 2.45,Standard: 'std2' },
{LabCode: 'VO',Zscore: 1.67,Standard: 'std2' }
]
let final = Object.values(elements.reduce((op,cur)=>{
if( op[cur['Standard']] ) {
op[cur['Standard']][cur['LabCode']] = cur['Zscore']
} else {
op[cur['Standard']] = {
'Standard' : cur['Standard'],
[cur['LabCode']]: cur['Zscore']
}
}
return op;
}, {} ))
console.log(final);
如果是 IE,你可以使用这个。
var elements = [
{LabCode: 'VA',Zscore: 0.5, Standard: 'std1' },
{LabCode: 'RE',Zscore: 0.53,Standard: 'std1' },
{LabCode: 'VO',Zscore: 1.5, Standard: 'std1' },
{LabCode: 'VA',Zscore: 3.4, Standard: 'std2' },
{LabCode: 'RE',Zscore: 2.45,Standard: 'std2' },
{LabCode: 'VO',Zscore: 1.67,Standard: 'std2' }
]
let final = elements.reduce((op,cur)=>{
if( op[cur['Standard']] ) {
op[cur['Standard']][cur['LabCode']] = cur['Zscore']
} else {
op[cur['Standard']] = {
'Standard' : cur['Standard'],
[cur['LabCode']]: cur['Zscore']
}
}
return op;
}, {} )
let finalop = [];
for(let key in final){
finalop.push(final[key])
}
console.log(finalop);
你可以通过一个 Array.reduce
和一些 ES6(没有 lodash)来完成这个:
var data = [{ LabCode: 'VA', Zscore: 0.5, Standard: 'std1' }, { LabCode: 'RE', Zscore: 0.53, Standard: 'std1' }, { LabCode: 'VO', Zscore: 1.5, Standard: 'std1' }, { LabCode: 'VA', Zscore: 3.4, Standard: 'std2' }, { LabCode: 'RE', Zscore: 2.45, Standard: 'std2' }, { LabCode: 'VO', Zscore: 1.67, Standard: 'std2' } ]
const result = data.reduce((r, {LabCode, Zscore, Standard}, i, a) => {
r[Standard] = r[Standard] || {}
r[Standard][LabCode] = Zscore
return i == a.length-1 ? Object.keys(r).map(k => ({Standard: k, ...r[k]})) : r
}, {})
console.log(result)