我有 JSON:(它的行太多,但是粘貼整個 json 會太長)
"data": {
"rows": [
{
"row_no": "130",
"sum_begin_period": "3234122.29",
"sum_end_period": "3099063"
},
{
"row_no": "150",
"sum_begin_period": "1252394",
"sum_end_period": "986382"
},
{
"row_no": "160",
"sum_begin_period": "1321400.28",
"sum_end_period": "1321400"
},
{
"row_no": "210",
"sum_begin_period": "3367691.4",
"sum_end_period": "1282444"
},
{
"row_no": "220",
"sum_begin_period": "2320199.07",
"sum_end_period": "265000"
},
{
"row_no": "260",
"sum_begin_period": "1047492.33",
"sum_end_period": "1017444"
},
{
"row_no": "610",
"sum_begin_period": "825495.3",
"sum_end_period": "960385"
}
]
}
我需要做一些數學運算,我需要多行的值。我怎樣才能優雅地做到這一點?
到目前為止我嘗試過的:
使用 Array.find():
let ccScore;
for(const row of finance_report){
const satr_390_1 = finance_report.find((row) => row.row_no === "390");
const satr_190_1 = finance_report.find((row) => row.row_no === "190");
const satr_211_1 = finance_report.find((row) => row.row_no === "211");
const satr_600_1 = finance_report.find((row) => row.row_no === "600");
if (satr_600_1== 0) return 1;
ccScore = (satr_390_1 - satr_190_1- satr_211_1) / satr_600_1;
if (ccScore < 0.5) return 1;
else if (ccScore >= 0.5 && ccScore < 2) return 3;
else if (ccScore >= 2) return 5;
}
上面的缺點是 Array.find 被重復了太多次。
使用 Array.maps():(在 .map() 的回呼中使用 IF 陳述句進行搜索)
let accounting_factor;
accounting_report.map((row) => {
let summ = 0;
if (row.row_no === "480") summ = parseInt(row.sum_end_period);
if (row.row_no === "490") summ = parseInt(row.sum_end_period);
if (row.row_no === "130") {
accounting_factor =
parseInt(row.sum_end_period) > parseInt(summ) ? false : true;
}
});
上面的缺點是 IF 重復。
是否有更優雅的方法不會強迫我重復我的代碼并使我能夠提取具有某些 rows.row_no 的物件(從“rows”陣列)然后進行操作?
PS如果 Array.reduce() 可以解決這個問題,我會很感激它的一個例子
uj5u.com熱心網友回復:
重組資料如下
let rows = {}
original.data.rows.forEach(row => rows[row.row_no] = row)
// USAGE
rows[ROW_NUM].sum_end_period
你可以試試這個,我相信它會更快,因為鍵值元組是一個索引物件,程式不必遍歷陣列中的每個元素。
uj5u.com熱心網友回復:
使用歸約函式將資料映射到行。
const mapped = data.rows.reduce((a,v)=>{a[v.row_no]=v;return a},{})
現在您的行由 row_no 索引
mapped['100']
uj5u.com熱心網友回復:
會Array.filter做這份作業嗎?
const rowNrsINeed = [220, 130, 800];
const filtered = retrieveData().data.rows.filter(row =>
rowNrsINeed.find(no => no === row.row_no));
filtered.forEach( r =>
console.log(`row: ${r.row_no}; sum_begin_period: ${r.sum_end_period}`) )
for (let row of filtered) {
// ... do stuff with each found row
}
function retrieveData() {
return {
"data": {
"rows": [{
"row_no": "130",
"sum_begin_period": "3234122.29",
"sum_end_period": "3099063"
},
{
"row_no": "150",
"sum_begin_period": "1252394",
"sum_end_period": "986382"
},
{
"row_no": "160",
"sum_begin_period": "1321400.28",
"sum_end_period": "1321400"
},
{
"row_no": "210",
"sum_begin_period": "3367691.4",
"sum_end_period": "1282444"
},
{
"row_no": "220",
"sum_begin_period": "2320199.07",
"sum_end_period": "265000"
},
{
"row_no": "260",
"sum_begin_period": "1047492.33",
"sum_end_period": "1017444"
},
{
"row_no": "610",
"sum_begin_period": "825495.3",
"sum_end_period": "960385"
}
]
}
};
}
uj5u.com熱心網友回復:
使用過濾器、包含和減少
const wantedRowIds = [390,190,211,600];
const wantedRows = finance_report.filter(row => wantedRowIds.includes( row.row_no));
const rowsById = wantedRows.reduce((acc,row) => ({...acc, [row.row_no]:row}),{});
然后像這樣使用它們 ccScore = rowsById[390] - rowsById[190] - rowsById[211] / rowsById[600];
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/416640.html
標籤:
