【问题标题】:dynamic array slicing to limit the length, when the limit is unset当未设置限制时,动态数组切片以限制长度
【发布时间】:2017-04-29 23:04:36
【问题描述】:

我有课

function Thing (n) {
    this.limit = n // null or int n
    this.table = [1, 2, 3, 4]
}

我想这样做是为了美观

Thing.prototype.test = function () {
    let that = this;
    return this.table
               .slice(0, that.limit) // this line
               .map() // etc
}

因为上面是简化的代码,而实际的table 是另一个类的实例,并且在 slice() 之前有另一个实例方法和调用 map()。

所以我想知道是否有一种方法可以强制切片到 Thing.limit(如果存在),否则切片并返回整个数组。 (在最后一个 map() 之前,数组很小)。类似的东西

Thing.prototype.test = function () {
    let that = this;
    return this.table
               .slice(0, (that.limit == null) ? this.length : that.limit)
               .map() // etc
}

这不起作用,我得到一个错误

ReferenceError: that is not defined

作为一个附带问题,slice() 中的this 上下文是什么?这是一个愚蠢的问题吗?

注意this.table.slice(0, -1) => [1, 2, 3]this.table.slice(0, 0) => []

我愿意更改Thing.limit 的保存方式,这主要是因为现在我很好奇,因为我已经将函数更改为slice,前提是this.plan.limit 存在&& > this.table.length .


实例化类的代码是

const gadget = new Gadget();
const query = new Thing(gadget);
const result = query.get(); 

可能相关:在实际代码中,在 query.get() 内部,还有另一个名为 getRowIds 的函数在 slice() 之前被调用,然后是一个非常基本的 map()。

错误发生在slice()

【问题讨论】:

  • 你能展示将 Thing 类实例化为变量的代码吗?因为我看不出为什么它会用你在这里发布的代码抛出这个错误。
  • 是的,会马上添加的
  • 另外,你不需要使用that,因为你在同一个范围内。如果你在 map 函数中需要它,你可以为它提供一个上下文作为第二个参数。
  • 哦,我很抱歉,我把这个/那个弄混了,你是对的。代码有效。如果您添加答案,我会接受! (实际的限制属性是关闭的“this.plan”,我会在我的代码中设置that = this.plan,并弄乱了切片中的代码。)

标签: javascript slice


【解决方案1】:

undefined 与 slice 的第二个参数一起使用将为您提供所需的行为。如果您出于某种原因接受 0 作为限制,如果有一个空表是一件事情,那么您可以使用它。

function Thing (n) {
    this.limit = n; // undefined or int
    this.table = [1, 2, 3, 4]
}


Thing.prototype.test = function () {
    return this.table
               .slice(0, this.limit)
               .map() // etc
}

现在请注意实例化,我看到您将 Gadget 的实例而不是数字传递给 Thing 构造函数,因此这可能与您的预期不同。

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 2012-12-23
    • 2015-11-13
    • 2014-08-19
    相关资源
    最近更新 更多