美好的一天,哥們,我正在嘗試將 3 個陣列轉換為 1 個物件。我需要每個月的陣列長度與另一個陣列長度一致如果有人知道如何解決它,我將不勝感激。感謝您抽出寶貴時間閱讀本文,祝您有美好的一天!
資料:
const months = [
"March 2022",
"April 2022",
"May 2022",
"June 2022"
]
const values = [
[ "-50" ],
[ "-100", "350", "-111" ],
[ "201", "200" ],
[ "-290" ]
]
const categories = [
[ "Credit" ],
[ "Debt", "Salary", "Credit" ],
[ "Salary", "Salary" ],
[ "Investments" ]
]
這是預期的結果:
[
{
"name": "March 2022",
"series":
{
"name": "Credit" ,
"value": -50
}
},
{
"name": "April 2022",
"series": [
{
"name": "Debt",
"value": -100
},
{
"name": "Salary",
"value": 350
},
{
"name": "Credit",
"value": -111
}
]
},
{
"name": "May 2022",
"series": [
{
"name": "Salary",
"value": 201
},
{
"name": "Salary",
"value": 200
}
]
},
{
"name": "June 2022",
"series":
{
"name": "Investments",
"value": -290
}
}
]
我在最后幾天所做的只是這段代碼,但它不起作用,在第二個元素的長度之前它正在作業,但是,當第三個元素的長度增加時,它們開始放樣,這還不是全部......我正在使用angular 的服務,并且當從 1 條路線導航到另一條路線時,它們的長度通過 index[i] 開始放樣(如果通過 crtl r 手動重繪 頁面它正在作業).. 當第一次呼叫 console.log 的回圈時(values[i] .length) 它的長度是 [1, 3, 2, 1] 是正確的,但是在下一次呼叫時(當翻頁時)長度是 [2, 6, 4, 2] 并且隨著每次呼叫而增加:
const months = [
"March 2022",
"April 2022",
"May 2022",
"June 2022"
]
const values = [
["-50"],
["-100", "350", "-111"],
["201", "200"],
["-290"]
]
const categories = [
["Credit"],
["Debt", "Salary", "Credit"],
["Salary", "Salary"],
["Investments"]
]
let result = [];
let subArray1 = [];
let subArray2 = [];
for (let i = 0; i < values.length; i ) {
// if 1 expense per month push to subArray1 => result
if (values[i].length == 1) {
subArray1.push([{
"name": categories[i],
"value": values[i]
}])
} else {
for (let j = 0; j < values[i].length; j ) {
// if more then 1 expense per month push to subArray2 => subArray1 => result
subArray2.push({
"name": categories[i][j],
"value": values[i][j]
});
};
subArray1.push(subArray2);
};
};
//combine all together
for (let i = 0; i < months.length; i ) {
result.push({
"name": months[i],
"series": subArray1[i]
});
};
uj5u.com熱心網友回復:
為了實作您的結果,我創建了一個構造series陣列的函式和一個使用該series函式的主函式。
let months = [
"March 2022",
"April 2022",
"May 2022",
"June 2022"
]
let values = [
["-50"],
["-100", "350", "-111"],
["201", "200"],
["-290"]
]
const categories = [
["Credit"],
["Debt", "Salary", "Credit"],
["Salary", "Salary"],
["Investments"]
]
const mapSeries = (index) => (values[index] || []).map((value, vindex) => ({
name: categories[index][vindex],
value
}))
const output = months.map((name, index) => ({
name,
series: mapSeries(index)
}))
console.log(output)
注意:
如果每個元素的陣列長度values和categories不一樣,那么在mapSeries函式中,我們可以做類似的事情categories[index]?.[vindex] || 'not assigned')來避免錯誤。
uj5u.com熱心網友回復:
你快到了,你只需要對你的代碼做一點小改動,你會很好的。
- 您需要在每次迭代時在回圈內初始化 subArray2,因為我們每次都需要單獨的陣列。
- 如果條件為內部 for 回圈無論如何都會處理它,而不管值的數量如何,您可以放棄
let months = ["March 2022","April 2022","May 2022","June 2022"]
let values = [["-50"],["-100", "350", "-111"],["201", "200"],["-290"]]
const categories = [["Credit"],["Debt", "Salary", "Credit"],["Salary", "Salary"],["Investments"]]
let result = [];
let subArray1 = [];
for (let i = 0; i < values.length; i ) {
let subArray2 = [];
for (let j = 0; j < values[i].length; j ) {
subArray2.push({
"name": categories[i][j],
"value": values[i][j]
});
};
subArray1.push(subArray2)
};
//combine all together
for (let i = 0; i < months.length; i ) {
result.push({
"name": months[i],
"series": subArray1[i]
});
};
console.log(result)
uj5u.com熱心網友回復:
您可以使用嵌套的 生成所需的結果map,首先是在month名稱上,然后是categories,使用回呼的第二個 ( index) 引數從其他陣列中選擇適當的值:
const months = [
"March 2022",
"April 2022",
"May 2022",
"June 2022"
]
const values = [
["-50"],
["-100", "350", "-111"],
["201", "200"],
["-290"]
]
const categories = [
["Credit"],
["Debt", "Salary", "Credit"],
["Salary", "Salary"],
["Investments"]
]
const result = months.map((m, mnum) => ({
name: m,
series: categories[mnum].map((c, cnum) => ({
name: c,
value: values[mnum][cnum]
}))
}))
console.log(result)
請注意,這段代碼總是回傳一個陣列series,看起來比試圖找出是陣列還是物件更容易處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/463608.html
標籤:javascript 数组 目的
上一篇:如何從嵌套物件重新計算物件?
下一篇:映射具有未知鍵或長度的物件陣列
