【问题标题】:Object return without assignment in JavaScriptJavaScript 中没有赋值的对象返回
【发布时间】:2019-02-14 00:48:04
【问题描述】:

我目前正在处理Eloquent JavaScript tutorial - 识别文本

我很难理解 for / of 循环中条件的 else 子句的对象分配发生在哪里。我看到的唯一分配是 findIndex 返回 -1,但是当我运行代码时,它还会为所有返回 true 的值创建一个对象。它怎么可能有一个名称值,它在哪里被分配?

function countBy(array, groupName) {
    let counts = [];

    for (let item of array) {
        let name = groupName(item);
        let known = counts.findIndex(count => count.name == name);

        if (known == -1) {
            counts.push({ name, count: 1 });
        } else {               
            counts[known].count++;
        }
    }
    return counts;
}

console.log(countBy([1, 2, 3, 4, 5], n => n > 2));
// → [{name: false, count: 2}, {name: true, count: 3}]

【问题讨论】:

  • 我的错。该数组已扩展为包含真值
  • name 来自 counts.push({ name, count: 1 });这与 counts.push({ name: name, count: 1 }); 相同
  • 我了解破坏部分

标签: javascript


【解决方案1】:

countBy 函数将一个数组划分为多个段,这些段标有从指定回调函数返回的名称。

在您的情况下,回调函数是n => n > 2,它可以返回truefalse,因此您的输入数组将被划分为名为@9​​87654325@ 和false 的段。

在代码中,counts 是目前看到的段数组。

let known = counts.findIndex(count => count.name == name);

检查我们之前是否看到过名称为name 的段。如果有,它的索引在known,我们可以直接增加它的计数。如果不是 (known == -1),我们将其添加为一个新段,初始计数为 1,名称为 name

【讨论】:

  • 所以let known = counts.findIndex(...) 将密钥name 添加到counts 内的所有对象?
  • @FlorestanKorp 不,findIndex 不会修改 counts。从添加到 counts.push({ name, count: 1 }); 时开始,所有对象都已具有 name 属性。
  • 知道了。第一次在空数组上调用 findIndex() 总是返回 -1,因此总是在 if() 子句中实例化一个对象。
【解决方案2】:

findIndex() 第一次在空数组上调用总是返回 -1,因此总是在 if(known == -1) 子句中实例化一个对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 2018-04-06
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多