我有一組資料,我正試圖將其轉換為不同的結構。我幾乎達到了要求,但我被困在最后一部分。這是代碼和我到目前為止所嘗試的。
let array1 = [
{
aggr_type: "mean",
date: ['19 Apr', '20 Apr'],
mean: [13.87, 8.42],
name: "TEMPERATURE",
sum: [0.1, 0.2]
},
{
aggr_type: "sum",
date: ['19 Apr', '20 Apr'],
mean: [45.42, 55.22],
name: "HUMIDITY",
sum: [0.3, 0.5]
}
];
let names = [];
array1.forEach(el => {
names.push(el.name);
});
const myObj = names.reduce((a, key) => Object.assign(a, { [key]: null, date: null }), {});
// console.log(myObj);
// console.log(array1);
let arrays = []
for(i=0; i < array1[0].date.length; i ) {
array1.forEach(el => {
myObj.date = el.date[i];
myObj[el.name] = el.[el.aggr_type][i];
arrays.push(myObj);
});
}
console.log(arrays);
如果此代碼段不起作用,請使用此代碼筆
我應該有這樣的輸出。
[
{
'TEMPERATURE': '13.87',
'date': '19 Apr',
'HUMIDITY': '0.3'
},
{
'TEMPERATURE': '8.42',
'date': '20 Apr',
'HUMIDITY': '0.5'
}
];
但它只回傳最后一個索引。有沒有辦法像我上面提到的那樣獲得輸出。
注意:這些值應添加到基于aggr_type
uj5u.com熱心網友回復:
以下可能是實作預期目標的一種可能解決方案。
代碼片段
// method to obtain the desired objective
const groupByDate = arr => (
Object.values( // extract only the "values" from result of "reduce"
arr.reduce( // use "reduce" to iterate over the array
(acc, {name, date, mean}) => {
date.forEach( // for each "date" in the "date-array"
(d, i) => { // populate / update the "acc" (accumulator)
acc[d] = {
...(acc[d] || {}),
[name]: mean[i], // this line populates either temperator or humidity
date: d,
}
}
)
return acc; // always return the "acc"
},
{} // initially the "acc" is set as an empty object
)
)
);
let array1 = [
{
aggr_type: "mean",
date: ['19 Apr', '20 Apr'],
mean: [13.87, 8.42],
name: "TEMPERATURE",
sum: [0.1, 0.2]
},
{
aggr_type: "sum",
date: ['19 Apr', '20 Apr'],
mean: [45.42, 55.22],
name: "HUMIDITY",
sum: [0.3, 0.5]
}
];
console.log(groupByDate(array1));
說明 上述代碼段中的行內注釋解釋了重要的方面。
編輯
array1使用了在問題上更新的輸入陣列。片段中的答案與問題中的預期陣列相匹配:
[
{
'TEMPERATURE': '13.87',
'date': '19 Apr',
'HUMIDITY': '45.42'
},
{
'TEMPERATURE': '8.42',
'date': '20 Apr',
'HUMIDITY': '55.22'
}
];
編輯 2
// method to obtain the desired objective
const groupByDate = arr => (
Object.values( // extract only the "values" from result of "reduce"
arr.reduce( // use "reduce" to iterate over the array
(acc, ob) => {
const {name, date, aggr_type} = ob;
const tgt = ob[aggr_type]; // decide whether to use "mean" or "sum"
date.forEach( // for each "date" in the "date-array"
(d, i) => { // populate / update the "acc" (accumulator)
acc[d] = {
...(acc[d] || {}),
[name]: tgt[i], // this line populates either temperature or humidity
date: d,
}
}
)
return acc; // always return the "acc"
},
{} // initially the "acc" is set as an empty object
)
)
);
let array1 = [
{
aggr_type: "mean",
date: ['19 Apr', '20 Apr'],
mean: [13.87, 8.42],
name: "TEMPERATURE",
sum: [0.1, 0.2]
},
{
aggr_type: "sum",
date: ['19 Apr', '20 Apr'],
mean: [45.42, 55.22],
name: "HUMIDITY",
sum: [0.3, 0.5]
}
];
console.log(groupByDate(array1));
uj5u.com熱心網友回復:
問題是您創建了一個myObj
const myObj = names.reduce((a, key) =>
Object.assign(a, { [key]: null, date: null }), {});
然后分配給它,然后將其推送到回圈中
for (i=0; i < array1[0].date.length; i ) {
array1.forEach(el => {
myObj.date = el.date[i]; // <-- modifies the ONE 'myObj'
myObj[el.name] = el.[el.aggr_type][i];
arrays.push(myObj); // <-- pushes the ONE myObj (again)
});
}
你最終myObj在你的arrays- 每次分配給它時得到 4 個參考,例如myObj.date = el.date[i],你正在修改那個唯一 myObj的......也就是說,在你第一次arrays.push(myObj)有arrays[0]containsmyObj之后,然后下一次通過回圈當您再次將值分配給 myObj 時,這會更改其中的值,arrays[0]因為那是 myObj.
您可以將myObj其視為原型- 您需要看起來像這樣的物件的單獨實體,myObj因此每個被推入arrays的物件都是一個獨特的物件。
盡可能少地修改原始代碼,這是可以完成的一種方法:
let array1 = [
{
aggr_type: "mean",
date: ['19 Apr', '20 Apr'],
mean: [13.87, 8.42],
name: "TEMPERATURE",
},
{
aggr_type: "mean1",
date: ['19 Apr', '20 Apr'],
mean: [45.42, 55.22],
name: "HUMIDITY",
}
];
let names = [];
array1.forEach(el => {
names.push(el.name);
});
// Changed the name here so I wouldn't have to change it in the loop
const protoMyObj = names.reduce((a, key) =>
Object.assign(a, { [key]: null, date: null }), {});
// console.log(myObj);
// console.log(array1);
let arrays = []
for (i=0; i < array1[0].date.length; i ) {
array1.forEach(el => {
// Make a new copy of the "prototype" `protoMyObj`
let myObj = Object.assign({}, protoMyObj);
myObj.date = el.date[i];
myObj[el.name] = el.mean[i];
arrays.push(myObj);
});
}
console.log(arrays);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/459139.html
標籤:javascript 数组 打字稿
