问题是当给定多个数组时,返回一个包含所有相交的数组值的数组。我已经阅读了一些解决方案,并且试图理解此哈希表解决方案。
我在理解这一行时遇到了麻烦:
a[propName] = a[propName] || {count:0, value: val};
据我了解,我们正在遍历子数组的每个元素。我们的累加器对象被赋予了子数组值的属性名称。
这就是我感到困惑的地方。我们的对象属性的值为a [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;
},[]);
}
最佳答案
您指向的行检查a[propName]
是否存在,如果不存在(因此它是undefined
),则将其初始化为{count:0, value: val};
。
让我们仔细看看。
首先,让我们使用更有意义的名称。 a
是accumulator
,用于跟踪所有内容的变量。
最初,它是一个空对象。
在c.forEach
的第一次迭代中,它没有属性。
因此,给定诸如'string | asd'之类的propName,它将添加其第一个属性,并且accumulator
变为accumulator = {'string|asd' : {count:0, value: val}};
。
然后增加计数值。
如果找到另一个'string | 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)