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)