我有这个矩阵算法问题:
输入:
const testObj = [
['Anna', 10, 'Monday'],
['Anna', 15, 'Wednesday'],
['Beatrice', 8, 'Monday'],
['Beatrice', 11, 'Wednesday'],
['Anna', 4, 'Wednesday'],
['Beatrice', 5, 'Monday'],
['Beatrice', 16, 'Monday']
]
输出:
let resultObj = [
['Anna', 10, 'Monday'],
['Beatrice', 11, 'Wednesday'],
['Anna', 19, 'Wednesday'],
['Beatrice', 27, 'Monday']
]
基本上,如果它是同一个人(col0)和同一天(col2),获取col1的总和,并合并。
我用javascript解决了这个问题,但任何语言的任何建议都可以。我做到了这一点:
const solveThis = async(obj) => {
for (let i = 0; i < obj.length; i += 1) {
if (obj[i + 1] && (obj[i][0] === obj[j][0]) && (obj[i][2] === obj[j][2])) {
let sum = obj[i][1] + obj[j][1],
newRow = new Array(obj[i + 1][0], sum, obj[i + 1][2])
obj.push(newRow)
let indexi = obj.indexOf(obj[i]),
indexj = obj.indexOf(obj[j])
obj.splice(indexi, 1)
obj.splice(indexj, 1
}
}
return obj
}
solveThis(testObj).then(result => console.log(result))
它不起作用。
答案 0 :(得分:7)
首先使用name|day
键创建一个对象,然后获取值。
const data = [['Anna', 10, 'Monday'],['Anna', 15, 'Wednesday'],['Beatrice', 8, 'Monday'],['Beatrice', 11, 'Wednesday'],['Anna', 4, 'Wednesday'],['Beatrice', 5, 'Monday'],['Beatrice', 16, 'Monday']]
const result = data.reduce((r, [name, v, day]) => {
const key = `${name}|${day}`;
if(!r[key]) r[key] = [name, v, day];
else r[key][1] += v;
return r;
}, {})
console.log(Object.values(result))
答案 1 :(得分:2)
您可以使用数组.reduce
方法创建新数组。对于每个项目,使用.find
查看是否存在具有匹配名称和日期的现有项目。如果是这样,请添加值,否则将项目放入新数组中。
示例:
const testObj = [
['Anna', 10, 'Monday'],
['Anna', 15, 'Wednesday'],
['Beatrice', 8, 'Monday'],
['Beatrice', 11, 'Wednesday'],
['Anna', 4, 'Wednesday'],
['Beatrice', 5, 'Monday'],
['Beatrice', 16, 'Monday']
];
function merge(arr) {
return arr.reduce((merged, item) => {
const existing = merged.find(o => o[0] === item[0] && o[2] === item[2]);
existing
? existing[1] += item[1]
: merged.push(item);
return merged;
}, []);
}
console.log(merge(testObj));