Javascript -求和2d数组
Javascript - sum 2d arrays
我有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));
}, [])
这是一个功能解决方案,它不会改变任何现有的输入数据。
相关文章:
- 匹配 2D 数组中的连续值
- 为什么用javascript覆盖2D数组的元素
- 在2D数组中动态推送新列
- 如何在javascript中创建一个空的2d数组?下面是我想要创建的一个示例
- 2D数组在Angular JS 1.2.x中工作,而不是在1.3.x中工作
- node.js上的过程性2d数组mongoDB插入内存不足
- 如何在 javascript 中删除 2d 数组中的行
- TypeError: matrix[y].push 在尝试使用 javascript 创建 2D 数组时不是一个函数
- 练习 2D 数组
- JavaScript 2d 数组导致“无法读取未定义的属性'未定义'”
- 如何在动态生成的 HTML 表中使用 2D 数组在 TD 标签中设置值
- 存储在 2D 数组中的 js 调用函数
- 将 2D 数组从 Code Behind 传递给 JavaScript
- 嵌套的 Jquery 每个 2D 数组错误地重复表单元格
- 如何在 2d 数组中找到 1d 数组
- 将2D对象数组C#转换为MVC中的Javascript
- 2d数组在ajax调用中崩溃
- 将具有类似数组内容的字符串转换为2D数组
- JavaScript将JSON存储在2D数组中
- 嵌套循环中数组2d中的javascript变量丢失