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

JS数组对象排序前后展示异常:为何数据重复显示3次?

问题:数组排序前后展示重复三次的原因及解决方法

我拥有一个数组对象,想要在排序前后分别将其展示出来。我的代码如下:

JavaScript代码:

const obj = [
    { name: "ahmad", family: "mahdavi", city: "esf", score: 10 },
    { name: "ali", family: "Ahmadi", city: "ahv", score: 5 },
    { name: "reza", family: "rezaei", city: "tehran", score: 3 },
    { name: "mohammad", family: "kiani", city: "shiraz", score: 19 }
];
let txt = "";
document.getElementById("p1").innerHTML = dis();

obj.sort(
    function (a, b) {
        return a.score - b.score;
    }
)

document.getElementById("p2").innerHTML = dis();


function dis() {
    obj.forEach(element => {
        txt += element.name + " " + element.family + " " + element.city + " " + element.score + "<br>";
    })
    return txt;
}

HTML代码:

<p id="p1"></p>

<p id="p2"></p>

但本该显示2次的数据却显示了3次,请问这是什么原因?

原因分析

问题出在全局变量txt的累加逻辑上:

  • 第一次调用dis()时,txt从空字符串开始,遍历数组后追加4条数据内容,p1显示这4条。
  • 第二次调用dis()时,没有重置txt,而是在已有4条内容的基础上,再次遍历数组追加4条新内容,此时txt变成8条内容,p2显示这8条。
  • 页面上总共显示4+8=12条数据,正好是原始4条数据的3倍,所以看起来像是显示了3次。

解决方法

把txt的声明移到dis()函数内部,每次调用函数时重新初始化空字符串,确保每次生成的都是当前数组的独立内容,不会累加:

const obj = [
    { name: "ahmad", family: "mahdavi", city: "esf", score: 10 },
    { name: "ali", family: "Ahmadi", city: "ahv", score: 5 },
    { name: "reza", family: "rezaei", city: "tehran", score: 3 },
    { name: "mohammad", family: "kiani", city: "shiraz", score: 19 }
];

document.getElementById("p1").innerHTML = dis();

obj.sort(function (a, b) {
    return a.score - b.score;
})

document.getElementById("p2").innerHTML = dis();


function dis() {
    // 每次调用函数都初始化新的空字符串
    let txt = "";
    obj.forEach(element => {
        txt += element.name + " " + element.family + " " + element.city + " " + element.score + "<br>";
    })
    return txt;
}

也可以用map方法简化dis()函数,代码更简洁:

function dis() {
    return obj.map(element => `${element.name} ${element.family} ${element.city} ${element.score}`).join('<br>');
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:57:25