问题在于给定多个数组返回一个包含所有相交数组值的数组。我已经阅读了一些解决方案,并且我正在尝试理解这个哈希表解决方案。
我无法理解这一行:
a[propName] = a[propName] || {count:0, value: val};
根据我的理解,我们循环遍历子阵列的每个元素。我们的accumulator对象被赋予子数组值的属性名称。
这是我感到困惑的地方。对象属性的值是[propName]。我不明白这个价值。我的理解是我们应该使我们的对象属性成为子数组的值(将行a[propName]=a[propName]
改为a[propName]=propName
)但是当我这样做时,我们无法计算属性发生的次数。我不明白为什么我们必须放置a[propName]
以及我们访问的数据结构与仅使用propName
不同。显然有一点不同,因为当我使用a[propName]
时,我们可以计算财产发生的次数。如果有人能够彻底解释发生了什么,我将非常感激。
function intersection(){
// convert arguments to array of arrays
var arrays = [].slice.call(arguments);
// create an object that tracks counts of instances and is type specific
// so numbers and strings would not be counted as same
var counts= arrays.reduce(function(a,c){
// iterate sub array and count element instances
c.forEach(function(val){
var propName = typeof val + '|' + val;
// if array value not previously encountered add a new property
a[propName] = a[propName] || {count:0, value: val};
// increment count for that property
a[propName].count++;
console.log(a);
});
return a;
},{});
// iterate above object to return array of values where count matches total arrays length
return Object.keys(counts).reduce(function(resArr, propName){
if(counts[propName].count === arrays.length){
resArr.push(counts[propName].value);
}
return resArr;
},[]);
}
答案 0 :(得分:1)
您指向的行会检查a[propName]
是否存在,如果不存在(因此它是undefined
),请将其初始化为{count:0, value: val};
。
让我们仔细看看。
首先,让我们使用更有意义的名字。 a
是accumulator
,用于跟踪所有内容的变量。
一开始,它是一个空物体。
在c.forEach
的第一次迭代中,它没有属性。
因此,如果支持类似' string | asd'的propName,则会添加其第一个属性,accumulator
变为accumulator = {'string|asd' : {count:0, value: val}};
。
然后递增count的值。
如果找到另一个'字符串| asd'它只是递增计数,因为支票a[propName] = a[propName] || {count:0, value: val};
只会保留支柱。
let a = {}
// a.c does not exist, therefore is undefined
console.log(a.c)
a.c = a.b || 1;
// a.c now is 1
console.log(a.c)
a.c = a.c || 2;
// a.c is still 1, because the `or` operator returns as soon as it finds a valid value
console.log(a.c)