我必须对对象数组进行排序,并且我已经编写了代码,但它只是不执行。该数组是相同的,当我查看调试器控制台时,它会直接跳到下一个函数并且不执行我的排序。我尝试了很多方法,但似乎没有任何效果。也许我忽略了一些东西,但我希望有人知道为什么它不执行。
我的代码:
function orderData(toSort) {
console.dir(toSort);
toSort.sort(compareCountries);
console.dir(toSort);
return toSort;
}
function compareCountries(a, b) {
var avgx = 0;
var avgy = 0;
avgx = calcAvgForAllProperties(a, avgx);
avgy = calcAvgForAllProperties(b, avgy);
a["overalAvg"] = avgx;
b["overalAvg"] = avgy;
if (a.overalAvg > b.overalAvg)
return -1;
else if (b.overalAvg < a.overalAvg)
return 1;
else
return 0;
}
或者:
function orderData(toSort) {
console.dir(toSort);
toSort.sort(function (a, b) {
var avgx = 0;
var avgy = 0;
avgx = calcAvgForAllProperties(a, avgx);
avgy = calcAvgForAllProperties(b, avgy);
a["overalAvg"] = avgx;
b["overalAvg"] = avgy;
if (a.overalAvg > b.overalAvg)
return -1;
else if (b.overalAvg < a.overalAvg)
return 1;
else
return 0;
});
console.dir(toSort);
return toSort;
}
//编辑 这是我的数据示例:
最佳答案
您的代码存在几个问题:
- 排序函数有副作用
你不应该计算overallAvg
在compareCountries
。相反,您应该在排序之前执行此操作。
var countries = [ /* your countries */ ];
countries.forEach(calculateCountryOverallFooAverage); // Standard forEach is not chainable.
countries.sort(compareCountriesByOverallFooAverage);
function calculateCountryOverallFooAverage(country) {
country.calculateOverallFooAverage();
}
function compareCountriesByOverallFooAverage(lhs, rhs) {
var lhsAvg = lhs.overallFooAverage();
var rhsAvg = rhs.overallFooAverage();
if (lhsAvg < rhsAvg) { return -1; }
else if(lhsAvg > rhsAvg) { return 1; }
return 0;
}
比较不正确,因为第二个测试与第一个测试等效(您执行
if (a < b) {} else if (b > a) {} else {}
)。应该是:if (a.overalAvg > b.overalAvg) return -1; else if (a.overalAvg < b.overalAvg) return 1; else return 0;
关于Javascript对对象数组进行排序未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34961945/