如何减少两个数组以获得自定义对象
How to reduce two array to get a custom object
我有两个对象数组,它们具有浮点值和用于简写类别的字符串。
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 }
]
简写类别字符串应 'translated' 到正确的类别标签,浮点值应推送到季节字段。
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[index] = label;
return r;
}, []),
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: 4.998184313725492 }],
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 }],
target = { cat1: { label: 'Cars', index: 0 }, catB: { label: 'Planes', index: 1 }, cat3: { label: 'People', index: 2 }, catD: { label: 'Vegetables', index: 3 } },
result = Object
.entries({ summer, winter })
.reduce((r, [key, data]) => {
r.season[key] = [];
data.forEach(({ _id, Average }) => r.season[key][target[_id].index] = Average);
return r;
}, { labels: getLabels(target), season: { }, title: 'Just a title string' });
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
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)
我有两个对象数组,它们具有浮点值和用于简写类别的字符串。
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 }
]
简写类别字符串应 'translated' 到正确的类别标签,浮点值应推送到季节字段。
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[index] = label;
return r;
}, []),
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: 4.998184313725492 }],
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 }],
target = { cat1: { label: 'Cars', index: 0 }, catB: { label: 'Planes', index: 1 }, cat3: { label: 'People', index: 2 }, catD: { label: 'Vegetables', index: 3 } },
result = Object
.entries({ summer, winter })
.reduce((r, [key, data]) => {
r.season[key] = [];
data.forEach(({ _id, Average }) => r.season[key][target[_id].index] = Average);
return r;
}, { labels: getLabels(target), season: { }, title: 'Just a title string' });
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
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)