问题是当给定多个数组时,返回一个包含所有相交的数组值的数组。我已经阅读了一些解决方案,并且试图理解此哈希表解决方案。

我在理解这一行时遇到了麻烦:

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};

让我们仔细看看。

首先,让我们使用更有意义的名称。 aaccumulator,用于跟踪所有内容的变量。

最初,它是一个空对象。

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)

10-02 12:29