JavaScript对象列表criteriaScore全部与最后一项一致问题求助
问题根因
- 你定义的
criteriaList是全局的对象数组,JS中对象是引用类型,你在calcLocScore方法中直接修改了criteriaList里原对象的score属性,同时把原对象直接push到了当前地点的criteriaScore数组中。 - 所有地点的
criteriaScore数组里存储的都是指向criteriaList中原对象的引用,每次调用calcLocScore都会覆盖这些对象的score值,最后一次调用(也就是给Location 3打分的调用)的修改结果会被所有引用指向的对象同步,所以你会看到所有地点的评分标准得分都和最后一个地点一致。 - 而
totalScore是数字类型(值类型),每次计算的结果是直接存储的独立数值,不会被后续修改影响,所以计算结果是正确的。
修复方案
每次处理评分标准时,先拷贝原始的评分标准对象,在新对象上添加得分,不要修改全局的原始评分标准数据:
const calcLocScore = () => { let locScore = { totalScore: 0, criteriaScore: [] // 每次初始化空数组存储当前地点的独立评分 } criteriaList.forEach(criteria => { // 浅拷贝原始criteria对象,避免修改全局对象和引用共享问题 const currCriteria = { ...criteria }; currCriteria.score = Math.floor(Math.random() * 50); locScore.totalScore += currCriteria.score; locScore.criteriaScore.push(currCriteria); }); return locScore; };
内容的提问来源于stack exchange,提问作者Nadir
相关产品推荐
相关产品推荐

