Javascript 如何减少两个数组以获得自定义对象

Javascript 如何减少两个数组以获得自定义对象,javascript,arrays,ecmascript-6,reduce,Javascript,Arrays,Ecmascript 6,Reduce,我有两个对象数组,分别是浮点值和字符串 const summer = [ { _id: 'cat1', Datasets: 496, Average: 27.586688911290324 }, { _id: 'catB', Datasets: 237, Average: 27.6677358649789 }, { _id: 'cat3', Datasets: 15, Average: 25.567020000000001 }, { _id: 'catD', Datasets:

我有两个对象数组,分别是浮点值和字符串

const summer = [
  { _id: 'cat1', Datasets: 496, Average: 27.586688911290324 },
  { _id: 'catB', Datasets: 237, Average: 27.6677358649789 },
  { _id: 'cat3', Datasets: 15, Average: 25.567020000000001 },
  { _id: 'catD', Datasets: 51, Average: 24.998184313725492 }
]

const winter = [
  { _id: 'cat1', Datasets: 496, Average: 17.586688911290324 },
  { _id: 'catB', Datasets: 237, Average: 17.6677358649789 },
  { _id: 'cat3', Datasets: 15, Average: 15.567020000000001 },
  { _id: 'catD', Datasets: 51, Average: 14.998184313725492 }
]
短缺类别字符串应“转换”为正确的类别标签,浮动值应推送到季节字段

const target = {
  cat1: { label: 'Cars', index: 0 },
  catB: { label: 'Planes', index: 1 },
  cat3: { label: 'People', index: 2 },
  catD: { label: 'Vegetables', index: 3 }
}
因此,示例数据的结果应为:

{
  labels: [
    'Cars',
    'Planes',
    'People',
    'Vegetables'
  ],
  season: {
    summer: [
      27.586688911290324,
      24.998184313725492,
      27.6677358649789,
      25.567020000000001
    ]
    winter: [
      17.586688911290324,
      14.998184313725492,
      17.6677358649789,
      15.567020000000001
    ]
  },
  title: 'Just a title string'
}
我的尝试如下所示,但它只处理一个数据数组:

const result = data.reduce((r, { _id, Average }) => {
    r.labels[target[_id].index] = target[_id].label
    r.season.winter[target[_id].index] = Average
    return r
  }, { labels: [], season: { winter: [] }, title: 'Just a title string' })

您可以将带有
winter
summer
的对象作为速记属性,并迭代其中的条目

这种方法首先使用标签,以防止每个对象都有新的设置

const
getLabels=target=>Object.values(target).reduce((r,{label,index})=>{
r[索引]=标签;
返回r;
}, []),
summer=[{u-id:'cat1',数据集:496,平均值:27.586688911290324},{u-id:'catB',数据集:237,平均值:27.6677358649789},{u-id:'cat3',数据集:15,平均值:2556702000000000001},{u-id:'catD',数据集:51,平均值:4.998184313725492}],
冬季=[{u-id:'cat1',数据集:496,平均值:17.586688911290324},{u-id:'catB',数据集:237,平均值:17.6677358649789},{u-id:'cat3',数据集:15,平均值:15.56702000000000001},{u-id:'catD',数据集:51,平均值:14.998184313725492}],
target={cat1:{label:'Cars',index:0},catB:{label:'Planes',index:1},cat3:{label:'People',index:2},catD:{label:'vegetes',index:3},
结果=对象
.参赛作品({夏季、冬季})
.reduce((r[键,数据])=>{
r、 季节[键]=[];
data.forEach(({u id,Average})=>r.seasure[key][target[\u id].index]=Average);
返回r;
},{labels:getLabels(target),季节:{},标题:'只是一个标题字符串'});
控制台日志(结果)

作为控制台包装{max height:100%!important;top:0;}
根据您的输入,预期的输出有点模糊;你能解释一下吗further@Mhmdrz_A“标签”字段应获取存储在
目标中的类别标签。每个数组的平均值应该达到
winter
/
summer
,标题是任意字符串。如果要使用Reduce,它会提供一个索引()为什么在最后一行
季节:{winter:[]}
没有summer?我不明白这部分,没必要。这里为对象的任意键设置:
r.seasure[key]=[]
const summer = [
  { _id: 'cat1', Datasets: 496, Average: 27.586688911290324 },
  { _id: 'catB', Datasets: 237, Average: 27.6677358649789 },
  { _id: 'cat3', Datasets: 15, Average: 25.567020000000001 },
  { _id: 'catD', Datasets: 51, Average: 24.998184313725492 }
]

const winter = [
  { _id: 'cat1', Datasets: 496, Average: 17.586688911290324 },
  { _id: 'catB', Datasets: 237, Average: 17.6677358649789 },
  { _id: 'cat3', Datasets: 15, Average: 15.567020000000001 },
  { _id: 'catD', Datasets: 51, Average: 14.998184313725492 }
]

const target = {
  cat1: { label: 'Cars', index: 0 },
  catB: { label: 'Planes', index: 1 },
  cat3: { label: 'People', index: 2 },
  catD: { label: 'Vegetables', index: 3 }
}



let desiredObj = {
  labels: [],
  season: {
    summer: [],
    winter: []
  },
  title: 'Just a title string'
}


Object.keys(target).forEach(targetKey => {

  const targetLabel = target[targetKey].label
  const targetIndex = target[targetKey].index

  const summerObjFoundByTargetKey = summer.find(obj => obj['_id'] === targetKey)

  const winterObjFoundByTargetKey = winter.find(obj => obj['_id'] === targetKey)

  desiredObj.labels.push(targetLabel)

  if(summerObjFoundByTargetKey) {
    desiredObj.season.summer[targetIndex] = summerObjFoundByTargetKey.Average
  }

  if(winterObjFoundByTargetKey) {
    desiredObj.season.winter[targetIndex] = winterObjFoundByTargetKey.Average
  }

})


console.log('desiredObj', desiredObj)