如果其他列的值与

时间:2018-05-18 20:47:10

标签: 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))

它不起作用。

2 个答案:

答案 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));