将值合并到一个二维数组中
merge values together in a 2d array
在尝试合并二维数组中的值时遇到一点问题。
例如:
const formatBids =
[
[4444, 10000],
[4444, 500],
[4455, 500],
];
如果第一个参数相同,我想对数组的第二个参数求和,所以最终结果是:
[
[4444, 10500],
[4455, 500],
];
我尝试了以下方法,但它不断地自我添加产生了错误的结果:
formatBids.map(bid => {
const map = new Map([bid]);
formatBids.forEach(arr => (arr[1] += map.get(arr[0]) ?? 0));
});
不确定解决此问题的最佳方法。想法?
您可以只将对象用作一种映射,并将数组中的第一项用作键。然后您可以使用 Object.entries() 将其转换回数组。像这样:
const formatBids =
[
[4444, 10000],
[4444, 500],
[4455, 500],
];
const totals = {}
for (const bid of formatBids) {
totals[bid[0]] = (totals[bid[0]] || 0) + bid[1];
}
console.log("as object:", totals, "as array:", Object.entries(totals));
const formatBids = [
[4444, 10000],
[4444, 500],
[4455, 500],
];
let merged = {}
formatBids.forEach((ele) => {
let key = parseInt(ele[0]);
merged[key] = (merged[key] ?? 0)+ele[1];
})
let mergedArr = Object.entries(merged);
console.log(mergedArr)
这是另一种方法
- 根据第一个索引对数组进行排序
- 如果 currentArr(merged Array) 为空,则推入数组。
- 如果不为空,则检查currentArr最后一个索引处的第一个元素是否等于CurrentElement的第一个索引。
- 如果是,则将第2个元素值加到currentArr的[n-1][1]
- 否则,将 currentElement 插入 currentArr
const formatBids = [
[4444, 10000],
[4444, 500],
[4455, 500],
];
var mergedArr = formatBids.sort().reduce((currentArr, currentElement) => {
let n = currentArr.length;
if (n === 0) return [currentElement];
if (currentElement[0] === currentArr[n - 1][0]) {
currentArr[n - 1][1] += currentElement[1];
return currentArr;
} else return [...currentArr, currentElement];
}, []);
console.log(mergedArr)
const formatBids =
[
[4444, 10000],
[4444, 500],
[4455, 500],
];
const result = Object.entries(formatBids.reduce((acc, [key, value]) => {
if (!acc[key]) acc[key] = value;
else acc[key] += value;
return acc;
}, {}));
console.log(result);
在尝试合并二维数组中的值时遇到一点问题。
例如:
const formatBids =
[
[4444, 10000],
[4444, 500],
[4455, 500],
];
如果第一个参数相同,我想对数组的第二个参数求和,所以最终结果是:
[
[4444, 10500],
[4455, 500],
];
我尝试了以下方法,但它不断地自我添加产生了错误的结果:
formatBids.map(bid => {
const map = new Map([bid]);
formatBids.forEach(arr => (arr[1] += map.get(arr[0]) ?? 0));
});
不确定解决此问题的最佳方法。想法?
您可以只将对象用作一种映射,并将数组中的第一项用作键。然后您可以使用 Object.entries() 将其转换回数组。像这样:
const formatBids =
[
[4444, 10000],
[4444, 500],
[4455, 500],
];
const totals = {}
for (const bid of formatBids) {
totals[bid[0]] = (totals[bid[0]] || 0) + bid[1];
}
console.log("as object:", totals, "as array:", Object.entries(totals));
const formatBids = [
[4444, 10000],
[4444, 500],
[4455, 500],
];
let merged = {}
formatBids.forEach((ele) => {
let key = parseInt(ele[0]);
merged[key] = (merged[key] ?? 0)+ele[1];
})
let mergedArr = Object.entries(merged);
console.log(mergedArr)
这是另一种方法
- 根据第一个索引对数组进行排序
- 如果 currentArr(merged Array) 为空,则推入数组。
- 如果不为空,则检查currentArr最后一个索引处的第一个元素是否等于CurrentElement的第一个索引。
- 如果是,则将第2个元素值加到currentArr的[n-1][1]
- 否则,将 currentElement 插入 currentArr
const formatBids = [
[4444, 10000],
[4444, 500],
[4455, 500],
];
var mergedArr = formatBids.sort().reduce((currentArr, currentElement) => {
let n = currentArr.length;
if (n === 0) return [currentElement];
if (currentElement[0] === currentArr[n - 1][0]) {
currentArr[n - 1][1] += currentElement[1];
return currentArr;
} else return [...currentArr, currentElement];
}, []);
console.log(mergedArr)
const formatBids =
[
[4444, 10000],
[4444, 500],
[4455, 500],
];
const result = Object.entries(formatBids.reduce((acc, [key, value]) => {
if (!acc[key]) acc[key] = value;
else acc[key] += value;
return acc;
}, {}));
console.log(result);