You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js计算属性中数组排序失效,求正确实现方式

问题分析与解决

核心错误点

1. 字符串排序逻辑错误

你在排序时使用了a.lname - b.lname,这种减法操作仅适用于数字类型比较。对于字符串,减法运算会返回NaN,而sort函数遇到NaN时无法正确判断顺序,导致数组排序完全失效。

2. 原地排序修改原数组

Array.sort()是原地排序方法,会直接修改原数组this.people。在computed属性中直接使用会违背其"无副作用"的设计原则,还可能引发不必要的视图更新或数据混乱。

修正后的computed属性

computed:{
  sortedPeople(){
    // 先复制原数组,避免修改data中的原始数据
    return [...this.people].sort((a, b) => {
      // 使用localeCompare比较字符串,支持多语言排序,默认实现升序
      return a.lname.localeCompare(b.lname);
    })
  }
}

代码说明

  • [...this.people]:通过扩展运算符创建原数组的浅拷贝,确保排序操作不会影响原始数据
  • localeCompare(b.lname):专门用于字符串的比较方法,返回负数、0或正数,分别对应a在b前、两者相等、a在b后,完美适配sort函数的要求

额外优化:Table组件的v-for位置

你的Table组件将v-for写在了<tbody>标签上,这会导致每个person生成一个独立的<tbody>,不符合HTML规范。建议把v-for移到<tr>标签上:

<template>
    <table class="table table-sm table-responsive table-hover">
        <thead>
            <tr>
                <th>Number</th>
                <th>Names</th>
                <th>Score</th>
            </tr>
        </thead>
        <tbody>
            <tr v-for="(person, i) in people" :key="i">
                <td>{{ i + 1 }}</td>
                <td>{{ `${person.fname} ${person.lname}` }}</td>
                <td>{{ Math.floor(Math.random() * 100) }}/100</td>
            </tr>
        </tbody>
    </table>
</template>

同时给v-for加上:key属性(Vue要求列表渲染必须提供唯一key以优化性能);将i+=1改为i+1,避免修改循环变量本身引发潜在问题。

内容的提问来源于stack exchange,提问作者user22249320

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 18:45:15