【问题标题】:Sorting array on a custom filter在自定义过滤器上排序数组
【发布时间】:2015-12-26 02:08:04
【问题描述】:

我有一个名为removeIndex 的自定义过滤器,它会删除数组的第一个索引。我想修改它,所以它首先对数组进行排序,然后删除第一个索引。但是,当我尝试这样做时,我的应用程序冻结了。这是我所拥有的:

filters: {
    removeIndex: function(value) {
        sort(value); // this crashes my browser
        return value.slice(1, value.length);
    }
}

为什么会导致我的浏览器崩溃?我应该这样做吗?我只想在切片之前对数组进行排序。

更新:当我执行console.log(value) 时,我得到的是:

所以它不仅仅是一个平面数组,还有其他东西与之相关。

这是我的使用方法:

  <tbody v-repeat="company in companies | filterBy searchText | orderBy 'name'">
    <tr>
      <td class="center aligned border" rowspan="@{{ company.applications.length }}" bgcolor="#F9FAFB"><a href="#"><strong>@{{ company.name }}</strong></a></td>
      <td><a href="#">@{{ company.applications[0] }}</a></td>
    </tr>
    <tr v-repeat="company.applications | removeIndex">
      <td><a href="#">@{{ $value }}</a></td>
    </tr>
  </tbody>

@ 签名是因为我在 Laravel 应用程序中使用它。

【问题讨论】:

  • 你能包含一个 MCVE 吗?

标签: javascript arrays sorting vue.js


【解决方案1】:

假设值是一个数组?

filters: {
    removeIndex: function(value) {
        return value.sort().slice(1);
    }
}

您可能希望提供自己的排序方法,因为默认的排序方法是基于 Unicode 的实现:

filters: {
    removeIndex: function(value) {
        return value.sort(function(a,b) { // return -1,0,1 as required})
                    .slice(1);
    }
}

【讨论】:

  • 感谢您的回复。我试过了,结果还是一样。由于某种原因,它进入了一个无限循环,我不知道为什么。
  • 评论返回并改写console.log(Array.isArray(value), value);以检查该值实际上是一个数组
  • 是的,它返回 true。
  • 命令[0,1,4,2].sort().slice(1)是否在浏览器中返回数组[1,2,4]?你的浏览器是什么?
  • 是的,我正在使用 Chrome。检查我更新的答案,我提供了更多详细信息。
【解决方案2】:

问题确实是一个无限循环。我在 Vue GitHub 页面上发现了一个与我的非常相似的问题:

https://github.com/yyx990803/vue/issues/1153

解决方法是先对数组进行切片创建副本,然后直接应用排序函数,如下所示:

return value.slice().sort().slice(1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 2017-10-06
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多