Javascript哈希表数据结构。路口&安培;减少

时间:2017-05-03 19:22:14

标签: javascript

问题在于给定多个数组返回一个包含所有相交数组值的数组。我已经阅读了一些解决方案,并且我正在尝试理解这个哈希表解决方案。

我无法理解这一行:

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;
  },[]);

}

1 个答案:

答案 0 :(得分:1)

您指向的行会检查a[propName]是否存在,如果不存在(因此它是undefined),请将其初始化为{count:0, value: val};

让我们仔细看看。

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

一开始,它是一个空物体。

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)