按值减少数组数组

Mat*_*ode 2 javascript arrayofarrays

我有一个类似于下面结构的数组。我正在尝试根据公司名称(例如公司 A)尽可能有效地减少数组。因此,基本上,在公司名称相同的情况下,合并内部数组,以便每个位置的数字添加到相应位置的匹配数组的数字中。此外,如果其中一个数组缺少电子邮件或电话,请获取具有值的电子邮件或电话位置。底部的 resultArray 显示了我想要实现的结果。

*注意 - 我不知道公司后面的数字的长度。长度是动态设置的,但每个内部数组的长度始终相同。因此,有时所有innerArray 的长度都是6 个值,有时它们的长度可能是20 个值。

var array = [
    [Company A, A-Email, A-Phone, 2, 5, 10],
    [Company A, A-Email, , 1, 10, 7],
    [Company A, , A-Phone, 3, 2, 4],
    [Company B, B-Email, , 1, 10, 7],
    [Company B, B-Email, B-Phone, 5, 10, 8],
    [Company C, C-Email, C-Phone, 3, 2, 1]
  ]
var resultArray = [
    [Company A, A-Email, A-Phone, 6, 17, 21],
    [Company B, B-Email, B-Phone, 6, 20, 15],
    [Company C, C-Email, C-Phone, 3, 2, 1]
  ]
Run Code Online (Sandbox Code Playgroud)

所以最初我尝试这样的事情,因为数组已经按公司名称排序:

for (var i = 0; i < array.length - 1; i++) {
  var firstArray = array[i]
  var nextArray = array[i + 1]
  if (nextArray[0] == firstArray[0]) {
    for (var t = 3; t <= firstArray.length; t++) {
      firstArray[t] = firstArray[t] + nextArray[t]

    }
    resultArray.push(firstArray);
} else {continue;}
Run Code Online (Sandbox Code Playgroud)

我有大量数据,这样做确实操作繁重,而且我的函数超时,所以我不完全确定它是否有效。我开始尝试使用哈希表执行归约方法,但我不太明白。关于如何最有效地做到这一点有什么想法吗?

另外我不能使用 jQuery,所以请使用纯粹的 javascript。

Edd*_*die 5

您可以使用 ES6reduce将数组汇总为对象。并使用Object.values将对象转换为数组。

注意: Fiddle(当前)无法工作。因此,您可能需要在浏览器上对其进行测试。

var array=[['Company A','A-Email','A-Phone',2,5,10],['Company A','A-Email',,1,10,7],['Company A',,'A-Phone',3,2,4],['Company B','B-Email',,1,10,7],['Company B','B-Email','B-Phone',5,10,8],['Company C','C-Email','C-Phone',3,2,1]];

var resultArray = Object.values(array.reduce((c, v) => {
  c[v[0]] = c[v[0]] || [v[0], null, null].concat(new Array(v.length - 3).fill(0));

  c[v[0]][1] = c[v[0]][1] || v[1]; //Update Email
  c[v[0]][2] = c[v[0]][2] || v[2]; //Update Phone

  //Loop thru the numbers and add
  for (var i = 3; i < v.length; i++) c[v[0]][i] += ( v[i] || 0 );
  return c;
}, {}));

console.log(resultArray);
Run Code Online (Sandbox Code Playgroud)