Javascript -求和2d数组

Javascript - sum 2d arrays

本文关键字:数组 2d 求和 Javascript      更新时间:2023-09-26

我有2个2d数组

var arr1 = [
  [1, 'a'],
  [2, 'b']
]
var arr2 = [
  [3, 'a'],
  [5, 'c']
]

我想把这两个数组加起来得到这个结果

var output = [
  [4, 'a'],
  [2, 'b'],
  [5, 'c']
]

我试着写2个.map函数,但随着期望的结果,这将返回很多重复的:

function sumArrays (arr1, arr2) {
  var output = [];
  arr2.map(function(i) {
    arr1.map(function(n) {
      if (i[1] === n[1]) {
        output.push([i[0] + n[0], i[1]])
      } else {
        output.push(i)
      }
    })
  })
  return output;
}

是否有更简单的方法来做到这一点,或者我现在应该删除所有东西,除了一个特定字符串的最大值?

谢谢你的帮助

当您不需要此方法返回的新数组时,请不要使用Array#map

您可以使用哈希表进行库存,并使用Array#forEach检查和更新arr2

使用arr1进行更新的建议

var arr1 = [[1, 'a'], [2, 'b']],
    arr2 = [[3, 'a'], [5, 'c']],
    inventory = Object.create(null);
arr1.forEach(function (a) {
    this[a[1]] = a;
}, inventory);
arr2.forEach(function (a) {
    if (!this[a[1]]) {
        this[a[1]] = [0, a[1]];
        arr1.push(this[a[1]]);
    }
    this[a[1]][0] += a[0];
}, inventory);
console.log(arr1);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于result新数组的建议。

var arr1 = [[1, 'a'], [2, 'b']],
    arr2 = [[3, 'a'], [5, 'c']],
    inventory = Object.create(null),
    result = arr1.map(function (a) {
        return this[a[1]] = [a[0], a[1]];
    }, inventory);
arr2.forEach(function (a) {
    if (!this[a[1]]) {
        this[a[1]] = [0, a[1]];
        result.push(this[a[1]]);
    }
    this[a[1]][0] += a[0];
}, inventory);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

这个问题本质上与这个相同,我建议使用相同的ES6代码,使用哈希(Set)和一些变体代码,我不会在这里重复:

function sumArrays(a, b) {
    return Array.from(
        b.reduce( (m, [v,k]) => m.set(k, (m.get(k) || 0) + v),
                   new Map(a.map ( ([v,k]) => [k,v] )) ), // swap pairs
        ([k,v]) => [v,k]) // swap back afterwards;
}
var arr1 = [
  [1, 'a'],
  [2, 'b']
]
var arr2 = [
  [3, 'a'],
  [5, 'c']
]
var result = sumArrays(arr1, arr2);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

您也可以对forEach()findIndex()执行此操作。

var arr1 = [
  [1, 'a'],
  [2, 'b']
]
var arr2 = [
  [3, 'a'],
  [5, 'c']
]
function sumArrays(arr1, arr2) {
  var r = arr1.slice(0);
  arr2.forEach(function(e) {
    var i = arr1.findIndex(function(a) {
      return e[1] == a[1];
    })
    i != -1 ? r[i][0] += e[0] : r.push(e)
  })
  return r;
}
console.log(sumArrays(arr1, arr2))

连接两个数组,这样您就有了一个包含所有元组的数组。

然后reduce那个元组数组,使得所有兼容的元组都被累加。

arr1.concat(arr2).reduce(function r(accumulator, iterand) {
    // base case: no tuples in accumulator
    if (accumulator.length == 0) {
        // add current tuple to our empty accumulator.
        return [iterand];
    }
    // first tuple in accumulator is compatible with the currently-inspected tuple
    if (accumulator[0][1] == iterand[1]) {
        // increment the count in the compatible tuple that already exists in the accumulator
        return [[accumulator[0][0]+iterand[0], accumulator[0][1]]].concat(accumulator.slice(1));
    }
    // currently-inspected tuple is not compatible with first tuple in accumulator. leave first tuple in accumulator unchanged. run the inductive case upon the remaining tuples in the accumulator.
    return [accumulator[0]].concat(r(accumulator.slice(1), iterand));
}, [])

这是一个功能解决方案,它不会改变任何现有的输入数据。