給定以下陣列,我需要按員工函式名稱減少它,并對幾行求和。
如果 Row[1] 與任何其他相等,則減少,并將 Row[2] 和 Row[5] 相加。
示例陣列
[
[ 20, 'AJUDANTE GERAL ', 2, 'HH', 6.36, 12.72, '', '' ],
[ 20, 'AJUDANTE GERAL ', 8, 'HH', 6.36, 50.88, '', '' ],
[ 20, 'AJUDANTE GERAL ', 0.15, 'HH', 6.36, 0.954, '', '' ],
[ 20, 'AJUDANTE GERAL ', 8, 'HH', 6.36, 50.88, '', '' ],
[ 125, 'CALDEREIRO', 8, 'HH', 13.05, 104.4, '', '' ],
[ 0, 'ISOLADOR', 2, 'HH', 10.68, 21.36, '', '' ],
[ 0, 'ISOLADOR', 8, 'HH', 10.68, 85.44, '', '' ],
[ 0, 'ISOLADOR', 0.15, 'HH', 10.68, 1.6019999999999999, '', '' ],
[ 585, 'PINTOR', 2, 'HH', 10.91, 21.82, '', '' ]
]
預期結果
[
[ 20, 'AJUDANTE GERAL ', 18.15, 'HH', 6.36, 115.434, '', '' ],
[ 125, 'CALDEREIRO', 8, 'HH', 13.05, 104.4, '', '' ],
[ 0, 'ISOLADOR', 10.15, 'HH', 10.68, 108.402, '', '' ],
[ 585, 'PINTOR', 2, 'HH', 10.91, 21.82, '', '' ]
]
我能夠使用一些for loops我認為這不是真正的交易來實作這一點,因為我在回圈期間更改了值。它正在作業,但是,我想了解如何使用減少和映射來做到這一點。
// sheetMapped is the array with all data duplicated
// uniqueRows is where I am keeping only the unique values with the sum values
let uniqueRows = [];
for (let i = 0; i < sheetMapped.length; i = 1) {
let row = sheetMapped[i];
let found = false;
for (let j = 0; j < uniqueRows.length; j = 1) {
let rowUniqueTest = uniqueRows[j];
if (row[1] === rowUniqueTest[1]) {
found = true;
uniqueRows[j][2] = row[2];
uniqueRows[j][5] = row[5];
break;
}
}
if (!found) {
uniqueRows.push(row);
}
}
我已經嘗試了一些使用Array.from, set Maps, 的示例reduces,但它們有點難以理解,因為我正在處理陣列中的更多資料,而不僅僅是key/value pairs.
提前致謝
uj5u.com熱心網友回復:
這可以通過使用reduce().
下面的代碼段使用 a ,Map因為它維護插入順序,而物件對數字屬性進行排序。Map使用Array.from()呼叫將結果轉換回陣列Map.values()
const input = [ [ 20, 'AJUDANTE GERAL ', 2, 'HH', 6.36, 12.72, '', '' ], [ 20, 'AJUDANTE GERAL ', 8, 'HH', 6.36, 50.88, '', '' ], [ 20, 'AJUDANTE GERAL ', 0.15, 'HH', 6.36, 0.954, '', '' ], [ 20, 'AJUDANTE GERAL ', 8, 'HH', 6.36, 50.88, '', '' ], [ 125, 'CALDEREIRO', 8, 'HH', 13.05, 104.4, '', '' ], [ 0, 'ISOLADOR', 2, 'HH', 10.68, 21.36, '', '' ], [ 0, 'ISOLADOR', 8, 'HH', 10.68, 85.44, '', '' ], [ 0, 'ISOLADOR', 0.15, 'HH', 10.68, 1.6019999999999999, '', '' ], [ 585, 'PINTOR', 2, 'HH', 10.91, 21.82, '', '' ], ];
const result = Array.from(
input
.reduce((a, row) => {
if (!a.has(row[1])) {
a.set(row[1], [...row]);
} else {
const _row = a.get(row[1]);
_row[2] = row[2];
_row[5] = row[5];
}
return a;
}, new Map())
.values()
);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
uj5u.com熱心網友回復:
用陣列作為累加器,reduce這是小菜一碟看看下面的代碼
var data = [
[ 20, 'AJUDANTE GERAL ', 2, 'HH', 6.36, 12.72, '', '' ],
[ 20, 'AJUDANTE GERAL ', 8, 'HH', 6.36, 50.88, '', '' ],
[ 20, 'AJUDANTE GERAL ', 0.15, 'HH', 6.36, 0.954, '', '' ],
[ 20, 'AJUDANTE GERAL ', 8, 'HH', 6.36, 50.88, '', '' ],
[ 125, 'CALDEREIRO', 8, 'HH', 13.05, 104.4, '', '' ],
[ 0, 'ISOLADOR', 2, 'HH', 10.68, 21.36, '', '' ],
[ 0, 'ISOLADOR', 8, 'HH', 10.68, 85.44, '', '' ],
[ 0, 'ISOLADOR', 0.15, 'HH', 10.68, 1.6019999999999999, '', '' ],
[ 585, 'PINTOR', 2, 'HH', 10.91, 21.82, '', '' ]
]
data = data.reduce((a,e)=>{
let sInd = a.findIndex(each=>each.indexOf(e[1]) != -1)
if(sInd >= 0){ // if entry added already
a[sInd][2] = e[2]
a[sInd][5] = e[5]
}
else{a.push(e)} // if new entry
return a
},[])
console.log(data.join("\n"))
uj5u.com熱心網友回復:
如果 row 和 col 是固定的,您可以使用以下示例代碼。合并為一個物件并獲取所有值。
const data = [
[20, "AJUDANTE GERAL ", 2, "HH", 6.36, 12.72, "", ""],[20, "AJUDANTE GERAL ", 8, "HH", 6.36, 50.88, "", ""],[20, "AJUDANTE GERAL ", 0.15, "HH", 6.36, 0.954, "", ""],[20, "AJUDANTE GERAL ", 8, "HH", 6.36, 50.88, "", ""],
[125, "CALDEREIRO", 8, "HH", 13.05, 104.4, "", ""],
[0, "ISOLADOR", 2, "HH", 10.68, 21.36, "", ""],[0, "ISOLADOR", 8, "HH", 10.68, 85.44, "", ""],[0, "ISOLADOR", 0.15, "HH", 10.68, 1.6019999999999999, "", ""],[585, "PINTOR", 2, "HH", 10.91, 21.82, "", ""],
];
const map = data.reduce((m, row) => {
const id = row[0];
if (id in m) {
m[id][2] = row[2];
m[id][5] = row[5];
} else {
m[id] = row;
}
return m;
}, {});
console.log(Object.values(map));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/321537.html
標籤:javascript 数组 多维数组 地图 降低
