Javascript 按值减少数组

Javascript 按值减少数组,javascript,arrayofarrays,Javascript,Arrayofarrays,我有一个类似于下面结构的数组。我正试图根据公司名称(例如A公司)尽可能有效地减少阵列。因此,基本上,当公司名称相同时,组合内部数组,以便将每个位置的数字添加到相应位置的匹配数组的数字中。另外,如果其中一个阵列缺少电子邮件或电话,则选择具有值的电子邮件或电话位置。底部的resultArray显示了我试图实现的结果 *注:我不知道跟随一家公司的数字的长度。长度是动态设置的,但每个内部数组的长度始终相同。所以有时候所有的innerArray都是6个值,其他时候它们的长度可能是20个值 var arra

我有一个类似于下面结构的数组。我正试图根据公司名称(例如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]
  ]
最初我尝试这样做是因为数组已经按公司名称排序:

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;}
for(变量i=0;i对于(var t=3;t您可以使用ES6
reduce
将数组汇总为一个对象,并使用
object.values
将对象转换为一个数组

注意:Fiddle(当前)不工作。因此您可能需要在浏览器上测试它

var数组=[[A公司,'A-Email','A-Phone',2,5,10],'A公司','A-Email',1,10,7],'A公司','A-Phone',3,2,4],'B公司','B-Email',1,10,7],'B公司','B-Email','B-Phone',5,10,8],'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(新数组(v.length-3).fill(0));
c[v[0]][1]=c[v[0]][1]| | v[1];//更新电子邮件
c[v[0]][2]=c[v[0][2]| | v[2];//更新手机
//循环遍历数字并添加
对于(变量i=3;ilog(resultArray);
哈希表将是正确的方法(假设'companya'等是字符串;否则它是映射)

var公司={};
对于(var i=0;i
您可以尝试以下方法。要点是使用
reduce()
获取一个对象,其中包含正确的数据,然后使用
object.values()
将其展平到数组中

//初始数据
风险值数据=[
['A公司','A-电子邮件','A-电话',2,5,10],
[“A公司”,“A-电子邮件”,1,10,7],
['A公司','A-电话',3,2,4],
[“B公司”,“B-电子邮件”,1,10,7],
[“B公司”、“B电子邮件”、“B电话”、5、10、8],
['C公司','C-电子邮件','C-电话',3,2,1]
];
//减少组织数据的功能
var减压器=功能(累加器、currentValue、currentIdx){
var[companyId,email,phone,i,j,k]=当前值;
累加器[公司ID]={
电子邮件:!累加器[companyId]?电子邮件:!累加器[companyId]。电子邮件?电子邮件:累加器[companyId]。电子邮件,
电话:!累加器[companyId]?电话:!累加器[companyId]。电话?电话:累加器[companyId]。电话,
i:(累加器[companyId]?累加器[companyId].i:0)+i,
j:(累加器[companyId]?累加器[companyId].j:0)+j,
k:(累加器[companyId]?累加器[companyId].k:0)+k
}
回流蓄能器;
}
var rawData=data.reduce(reducer,{});
//将数据组织回数组中
var formattedData=[];
for(输入原始数据){
formattedData.push([key].concat(Object.values(rawData[key]));
}

console.log(格式化数据)这就是你要寻找的答案。嗨,Eddie,谢谢你的回答。我只是稍微编辑了一下我的问题。我忘了我并不总是知道innerArray的长度。数组是动态创建的,所以有时innerArray的长度可能是6个值,有时是20个值。但是innerArray的长度总是相同的。这是吗如果是这种情况,解决方案是有效的?有没有办法在innerArray的长度上循环并执行相同的操作?您的意思是,它可能类似于
['Company a'、'a-Email'、'a-Phone',2,5,10,40,5,6,7,8,7,7]
?正确。在收到数组之前,我永远不知道后面会有多少个数字。但是内部数组的长度总是相同的,但前3个都是常量,名称、电子邮件、电话?嗨,本,谢谢你的回答。我刚刚编辑了我的问题。我忘了我并不总是知道内部数组的长度。数组是dyNAMICAL创建,因此有时长度可能为6个值,有时为20,因此有时可能有num4、num5、num6等。
var companies = {};
for ( var i = 0; i < array.length; i++ ) {
    var item = array[ i ];
    var name = item[ 0 ];
    var phone = item[ 1 ];
    var num1 = item[ 2 ];
    var num2 = item[ 3 ];
    var num3 = item[ 4 ];
    if ( companies[ name ] ) {
        var record = companies[ name ];
        record[ 1 ] = record[ 1 ] || email;
        record[ 2 ] = record[ 2 ] || phone;
        record[ 2 ] += num1;
        record[ 3 ] += num2;
        record[ 4 ] += num3;
    } else {
        companies[ name ] = [ name, email, phone, num1, num2, num3 ]
    }
}
var resultArray = Object.values( companies );