Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 显示唯一的数组项和单独数组中相关项的总和_Javascript_Arrays - Fatal编程技术网

Javascript 显示唯一的数组项和单独数组中相关项的总和

Javascript 显示唯一的数组项和单独数组中相关项的总和,javascript,arrays,Javascript,Arrays,我尝试使用两个相关的数组,一个用于检索唯一值,另一个需要求唯一值的和。数组1的索引与数组2的索引匹配,我需要将所有值相加以获得总和。例如: 阵列1: var arr1 = [7012, 7013, 7015, 7012]; 阵列2: var arr2 = [10, 20, 25, 10]; 预期产出: (第一个解释不是很好,改变了这个) 注意:我使用Firebase将值检索到数组中,这些值不会被设置为索引 我使用Set()检索唯一值: var newArr = [...new Set(arr

我尝试使用两个相关的数组,一个用于检索唯一值,另一个需要求唯一值的和。数组1的索引与数组2的索引匹配,我需要将所有值相加以获得总和。例如:

阵列1:

var arr1 = [7012, 7013, 7015, 7012];
阵列2:

var arr2 = [10, 20, 25, 10];
预期产出:

(第一个解释不是很好,改变了这个)

注意:我使用Firebase将值检索到数组中,这些值不会被设置为索引

我使用Set()检索唯一值:

var newArr = [...new Set(arr1)];
这很好用

我遇到的麻烦是从数组2获取相关值并求和。我可以通过使用.reduce()创建一个精细的和,但是我很难根据数组1中的值的相关关系来确定如何将数组2的值放入一个新数组。

您可以使用与
数组1
相同的键来使用和存储相应的值。然后得到求和的值

var array1=[7012,7013,7015,7012],
array2=[10,20,25,10],
map=array1.reduce((m,k,i)=>(m.set(k,(m.get(k)| | 0)+array2[i]),新map),
sum=[…map.values()].reduce((r,v)=>r+v,0);
log([…map]);
控制台日志(总和)

.as console wrapper{max height:100%!important;top:0;}
据我所知,您希望根据arr1处的相等值对arr2进行分组和汇总。因此,您可以创建一个哈希表:

var arr1 = [7012, 7013, 7015, 7012];
var arr2 = [10, 20, 25, 10];

var obj={};
arr1.forEach(function(el,i){//el is a value of arr1 at index i, e.g. 7012,0
  obj[el]=obj[el]||0;//initialise obj[7012]
  obj[el]+=arr2[i]||0;//increase obj[7012] by arr2[0] so 10
});

console.log(obj);
将创建:

{
7012:20,
7013:20,
7015:25
}
您可以使用将唯一数组的值替换为arr2对应位置的值,然后使用获得总和:

const sum = [...new Set(arr1)].
  map( x => arr2[ arr1.indexOf( x ) ] ).
  reduce( ( a, b ) => a + b, 0 )
;

如果我理解正确,您需要一个数组,该数组将包含array2中用于array1唯一值的各个和。使用
映射
我们可以得到唯一的值以及相应的和。然后可以使用
Map#values
获取数组2的和,
Map#keys
获取数组1的唯一值,
Map#entries
获取唯一值和和和的元组

const arr1=[7012、7013、7015、7012];
常数arr2=[10,20,25,10];
const map=arr1.reduce((map,v,i)=>{
const sum=map.get(v)| 0;
返回映射集(v,sum+arr2[i]);
},新地图());
常量arr1Unique=[…map.keys()];
常量arr2Sums=[…map.values()];
常量元组=[…map.entries()];
控制台日志(arr1Unique);
控制台日志(arr2Sums);

log(元组)数组1中相同值的值是否相等?为什么不为数组2使用Set?然后加上唯一的值?哪些和?arr[0]+arr2[0]还是什么?如果数组的长度不同,会发生什么情况?为什么需要这个(可能是XY问题)您的示例没有显示预期的输出。目前还不清楚要在总和中包含哪些值。对不起,忘记包含预期输出。看起来是这样的:7012:20 7013:20 7015:25基本上,我需要将array2值的总和与array1的唯一值的相同索引相加,但在我使这些值唯一之前。@TaylorNellis请编辑您的问题,7012:20是一个对象属性,如果我只需要得到数组2唯一值的总和,它就可以正常工作。我需要数组2的值保持不唯一,以便我可以得到数组1中每个唯一值的正确总数。是的,谢谢。我的解释不是很好,但你明白了。我不知道你能用这种方式使用地图。
const sum = [...new Set(arr1)].
  map( x => arr2[ arr1.indexOf( x ) ] ).
  reduce( ( a, b ) => a + b, 0 )
;