javascript - 如果其他列的值匹配,则获取列的总和

标签 javascript arrays object

我有这个矩阵算法问题:

输入:

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))

它不起作用。

最佳答案

首先用 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))

关于javascript - 如果其他列的值匹配,则获取列的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50419051/

相关文章:

javascript - 制作简单的按钮来自动滚动到下一个和上一个 Id'd 元素

php - 在 PHP 和 Javascript 二维数组之间传输数据库数据

javascript - 根据输入将字符串分解为多个对象

javascript - 如何根据属性值从单个对象数组创建多个对象数组

javascript - 如何使用javascript从对象列表中获取重复的IP地址?

javascript - 如果值等于 Jquery Unfocus 字段

arrays - 对 API 进行最少调用的算法

javascript - 需要一个数组,其中新数组的第一个元素=除第一个元素之外的所有元素的总和-Javascript

java - java 对象和转换

javascript - 有没有办法让事件总时间始终为24小时