【问题标题】:eloquent javascript correlation tableFor explanation雄辩的javascript相关表解释
【发布时间】:2017-08-15 16:51:56
【问题描述】:

我正在迈出编程的第一步,我被 eloquent 的这个问题困住了,尤其是松鼠问题。就是这样:

function hasEvent(event, entry) {
 return entry.events.indexOf(event) != -1;
}

function tableFor(event, journal) {
  var table = [0, 0, 0, 0];
   for (var i = 0; i < journal.length; i++) {
     var entry = journal[i], index = 0;
      if (hasEvent(event, entry)) index += 1;
      if (entry.squirrel) index += 2;
      table[index] += 1;
 }
 return table;
}

console.log(tableFor("pizza", JOURNAL));
// → [76, 9, 4, 1]

我确实理解第一个函数 hasevent,如果条目包含给定事件,它会返回 true。

我无法理解的是 tableFor 函数。我无法了解函数如何流动以及表如何获取其值。例如对于 console.log(tableFor("pizza", JOURNAL)); , 我们得到 [76, 9, 4, 1]。但是看在上帝的份上怎么办?

期刊由本书提供,如下所示:

var JOURNAL = [
  {"events":["pizza","exercise","weekend"],"squirrel":false},
  {"events":["bread","pudding","brushed teeth","weekend","touched 
  tree"],"squirrel":false},
  {"events":["carrot","nachos","brushed 
  teeth","cycling","weekend"],"squirrel":false},
  {"events":["brussel sprouts","ice cream","brushed 
  teeth","computer","weekend"],"squirrel":false},
  {"events":["potatoes","candy","brushed 
  teeth","exercise","weekend","dentist"],"squirrel":false},
  {"events":["brussel sprouts","pudding","brushed 
  teeth","running","weekend"],"squirrel":false},
  {"events":["pizza","brushed teeth","computer","work","touched 
  tree"],"squirrel":false},
  {"events":["bread","beer","brushed 
  teeth","cycling","work"],"squirrel":false},
  {"events":["cauliflower","brushed teeth","work"],"squirrel":false},
  {"events":["pizza","brushed teeth","cycling","work"],"squirrel":false},
  {"events":["lasagna","nachos","brushed teeth","work"],"squirrel":false},
  {"events":["brushed teeth","weekend","touched tree"],"squirrel":false},
  {"events":["lettuce","brushed 
   teeth","television","weekend"],"squirrel":false},
  {"events":["spaghetti","brushed teeth","work"],"squirrel":false},
  {"events":["brushed teeth","computer","work"],"squirrel":false},
  {"events":["lettuce","nachos","brushed teeth","work"],"squirrel":false},
  {"events":["carrot","brushed teeth","running","work"],"squirrel":false} ...etc

我的理解是一个事件作为参数传递,它会查看 Jounral 中的对象数组以查看它是否存在。但是计数是如何发生的呢?

if (entry.squirrel) index += 2;

为什么是 +2 ?为什么不索引 += 3;或索引 += 4; ???

最后为什么 table[index] += 1; ???

例如,第一个循环是这样的,for: console.log(tableFor("pizza", JOURNAL));

//FLOW
i=0;

从日志上面的第一行开始,披萨出现了。

     if (hasEvent(event, entry)) index += 1;

所以索引增加并变为1。它继续:

     if (entry.squirrel) index += 2; 

squirel 是假的,所以 index 没有任何反应。如果找到 squirel,为什么是 +2 ???

那么 表[索引] += 1 从这一点上我无法理解。

有人可以帮我分解一下吗?这对我的训练很有帮助。

提前谢谢你。

【问题讨论】:

    标签: javascript arrays eloquent


    【解决方案1】:

    table 数组是满足不同条件的条目的计数。 table[3]entry.squirrelhasEvent(event, entry) 都为真的条目数。 table[2] 是只有entry.squirrel 为真的计数,table[1] 是只有hasEvent(event, entry) 为真的计数,table[0] 是两者都不为真的计数。

    所以逻辑是index0 开始。如果hasEvent(event, entry) 为真,我们将1 添加到它。如果entry.squirrel 为真,我们将2 添加到其中。结果是,如果两者都为真,我们最终会添加3。如果两者都不是真的,我们不会添加任何东西,所以它仍然是0

    然后我们将1 添加到table[index] 以增加该计数器。

    【讨论】:

    • 在放置大量控制台日志并阅读您的答案后,我终于明白了这个逻辑背后的原因。但是他是如何想出将每个索引增量放在正确情况下的逻辑的呢?例如,如果我们的表格数组中有五个元素,我们会设置 table[index] += 3 吗?非常感谢您的回答,我现在可以安然入睡了..
    • 它实际上是二进制的。索引中的每个位对应于一个标准,加上 2 的幂相当于在索引的二进制表示中设置位。如果有更多标准,他们将使用index += 4;index += 8
    • table 数组的大小是 2**n,其中 n 是条件的数量,因为这是条件的不同组合的数量。
    【解决方案2】:
    1. 关于 JOURNAL :: 每个条目都有 eventsbecome 的列表 松鼠?布尔值。
    2. 关于代码 ::

    输入 --> 事件([beer, bread, brushed teeth, brussel sprouts, candy, carrot, cauliflower, computer, cycling, dentist, exercise, ice cream, lasagna, lettuce, nachos, peanuts, pizza, potatoes, pudding, reading, running, spaghetti, television, touched tree, weekend, work] 之一)。

    输出 --> 表格(1 X 4)

    table[0] -- Number of entries in JOURNAL which does not has given event and  squirrel is False.
    table[1] -- Number of entries in JOURNAL which has given event and  squirrel is False.
    table[2] -- Number of entries in JOURNAL which does not has given event and  squirrel is True.
    table[3] -- Number of entries in JOURNAL which has given event and  squirrel is True.
    
    **hasEvent(event, entry)  entry.squirrel  table[index]** 
    False                   False           table[0] += 1
    True                    False           table[1] += 1
    False                   True            table[2] += 1
    True                    True            table[3] += 1
    

    【讨论】:

      【解决方案3】:

      我正在阅读同一本书,并且遇到了这个讨论,并认为我也可以做出贡献。我也是初学者,如有错误请指正。反正我是这样理解的:

      首先,我们调用函数tableFor,带有两个参数"pizza"(一个字符串;雅克变成松鼠的可能原因之一,我们必须检查)和JOURNAL(一个对象;它由以下属性:"events" - 可能的原因 - 和 "squirrel" - Jacques 那天是否变成了松鼠)。 JOURNAL 本身是一个由多个对象组成的数组。此外,"events"property 也是一个数组。

      然后"pizza"JOURNAL这两个参数被传递给tableFor参数eventjournal,所以现在"pizza"eventJOURNALjournal

      由于最终结果必须是一个由 4 个元素组成的数组,因此我们可以稍后计算相关性,因此我们声明一个变量来存储该数组: var table = [0, 0, 0, 0];然后我们必须想办法让数组的值在需要时自行增加:for (var i = 0; i &lt; journal.length; i++) 这意味着我们正在循环遍历journal 的每个元素。 i = 0 表示我们目前正在journal 数组的第一个元素中寻找"pizza",然后移动到第二个元素。第三个等直到数组的最后一个元素,因此i &lt; journal.length

      var entry = journal[i], index = 0;表示我们取数组的第n个元素赋值给entry变量,并将indextable数组中的当前索引)定义为0。

      这里我们调用另一个函数hasEvent

      <pre>if (hasEvent(event, entry)) index += 1;
      if (entry.squirrel) index += 2;</pre>
      
      <pre>function hasEvent(event, entry) {
      return entry.events.indexOf(event) != -1;
      }</pre>
      

      这意味着我们取event"pizza")和entryjournal数组的第0个元素,并检查它是否包含关键字"pizza"。如果它不包含它indexOf 将返回-1,如果它包含它将返回给定元素存在的第一个索引。在我们的第一种情况下,{"events":["carrot","exercise","weekend"],"squirrel":false},没有"pizza",所以indexOf 将返回-1。这行if (hasEvent(event, entry)) index += 1; 询问hasEvent 是否为真(indexOf 是否不等于-1)。在我们的例子中它等于 -1,所以我们不将 1 添加到 index。而if (entry.squirrel) index += 2;这一行询问雅克变成松鼠是不是真的(我们可以看出是假的),所以我们不给index加2。所以我们当前使用的索引仍然是 0。现在我们将它增加 1 (table[index] += 1;),所以在第一个场景中,我们得到以下结果 [1, 0, 0, 0]。

      还值得一提的是,在我们的table 数组中:

      `index 0 = 00 (no pizza, no squirrel)
      index 1 = 10 (pizza, no squirrel)
      index 2 = 01 (no pizza, squirrel)
      index 3 = 11 (pizza, squirrel)`
      

      因此,根据每种情况,我们将从索引 0 移动到索引 1、2、3 或停留在索引 0 并根据满足的条件将其增加一。 我希望有人发现我的解释/理解有用。

      【讨论】:

        【解决方案4】:

        我也对以下内容感到困惑:

        if (entry.events.includes(event)) index += 1;
        
        if (entry.squirrel) index += 2;
        
        table[index] += 1;
        

        这实际上意味着:如果 (entry.events.includes(event)) index += 1; === true,索引加 1。在这种情况下,我们可以将其翻译为table[1] += 1

        如果下面的情况也是如此,

        if (entry.squirrel) index += 2;
        

        然后: table[3] += 1

        仅当squirrelentry=== true 时才会填充table[3]

        if (entry.squirrel) index += 2 增加 2,因为 squirreltable[2] 中为真。

        table[index] 实际上只是我们想要用作目标的索引。

        【讨论】:

          【解决方案5】:

          查看此说明

          听着。我相信 table=[0,0,0,0];为了得到这个答案,我将表格表示为 [随便,随便,随便,随便] 而不是零。

          这个 for 循环将一次访问一个元素的条目数组中的每个元素,从一个条目数组到下一个数组,从 Jacques 经历记录的第 1 天到最后一天。 for(let i = 0; i

          下一步,通过创建一个名为 entry 的简单变量(绑定等)来使元素更易于访问(它可以有任何变量名,但它被称为 entry)。即,let entry = journal[i], index = 0; entry 将是 Journal 中的每个元素。 index=0,该索引属于表。

          每次 table[index] 更新时,通过加 1,index = 0 也加 1。这将发生在 table =[+1,whatever,whatever,whatever] 或 [1, 0, 0, 0]

          除了它看到事件(pizza),即 if (entry.events.includes(event)), index+=1; 然后 table[index] 将 1 添加到第二个零。这将发生在 table= [Whatever, +1, whatever, whatever] 或 [0, +1, 0, 0]

          当它认为 squirrel 为真时,table[index] 将 1 添加到第三个零,而不是执行前两个步骤。 if (entry.squirrwl), index+= 2; 表格看起来像这样 [随便,随便,+1,随便]

          现在检查一下,if(entry.events.includes(event)),index+= 1; if(entry.squirrel) index+= 2 当它同时看到 event 和 squirrel 时,即如果两者都是比萨饼和 squirell 同时出现,会发生什么?由于 double if,table[index] 更新了 table 中的第四个零,即 event +=1, squirrel += 2 = +3。所以 table[index] 将 1 添加到第四个也是最后一个零,即 table 的第三个索引 = [0,0,0,adds 1] 或 [whatever,whatever,whatever,+1]

          发生这种情况是因为情况不同,在这里它看到了松鼠和事件。以前它要么看到

          • 松鼠和事件都没有[adds+1,0,0,0],
          • 或者它单独看到了事件[0,adds+1,0,0],
          • 或单独的松鼠[0,0,adds+1,0],
          • 现在它同时看到了 event 和 squirrel[0,0,0,adds+1],这是 double if 的力量。

          我在这个或它的语法上并不完美,但如果它是错误的,我很想听听 cmets 或进行更正。因此,请注意如何使用循环遍历数据集条目并在函数中有一个数组来更新某些信息的循环,注意索引以及 if 语句如何使它们更新函数中的数组。

          【讨论】:

            猜你喜欢
            • 2020-11-03
            • 2015-12-05
            • 1970-01-01
            • 2015-07-25
            • 2020-06-08
            • 1970-01-01
            • 2019-02-13
            • 1970-01-01
            相关资源
            最近更新 更多