要学习Knockout JS,我(慢慢地)在浏览器中构建成绩簿。我最近的问题涉及在可观察数组中删除最低分数。我有一个student
模型,它有一个名为scores
的可观察数组。该数组由可观察的分数组成,这些分数是普通数字。
我删除最低等级的方法如下。首先,我将每个scores
数组排序为高 - 低,然后,现在,拼接数组的末尾,使两个最低的数字存储到一个名为low
的新数组中。当我计算平均值时,low
变量将在稍后使用。
首先,我当前的dropLowestGrades
方法彻底删除了dom中的数据,这是我不想要的。其次,myObservableArray.sort()
似乎没有进行任何排序!我不知道该往哪里去。相关脚本如下。
var StudentsViewModel = (function () {
function StudentsViewModel() {
var _this = this;
...
this.dropLowestScores = function() {
var low = [];
ko.utils.arrayForEach(_this.students(), function(student){
console.log(student.fullName());
student.scores().sort();
/*
student.scores().sort(function(a, b) {
return a() == b() ? 0 : (a() > b() ? 1 : -1);
});
*/
low = student.scores.splice((student.scores().length-2),student.scores().length);
console.log('low: ' + low);
return low;
});
};
我目前只是将函数绑定到一个按钮。为了简单起见,我将下降硬编码为两个分数。我稍后会允许用户传入一个值。请注意,该按钮的名称为" Sort"现在因为我原本会有一个排序功能,然后在它上面构建我的dropLowestScores
方法。
<button data-bind="click: dropLowestScores">Sort</button>
根据答案的见解,我已经大大更新了我的方法。下面的脚本仍然会削减我的scores
数组中的值,我不想改变它。
this.dropLowestScores = function() {
ko.utils.arrayForEach(_this.students(), function(student){
console.log(student.fullName());
var tmp = student.scores().sort();
console.log(tmp);
student.lowest = tmp.splice((tmp.length-2),tmp.length);
console.log('student lowest: ' + student.lowest);
});
};
我更改了我的StudentModel
,使其现在具有属性lowest
,用于跟踪用户降低成绩时的最低分数。
var StudentModel = (function () {
function StudentModel(fullName) {
var _this = this;
this.fullName = ko.observable(fullName);
this.scores = ko.observableArray();
this.lowest = [];
...
答案 0 :(得分:1)
您需要记住像sort()
这样的函数返回数组的排序列表,它们实际上并不会对数组本身进行转换。
var studentScores = student.scores().sort();
或类似的东西 -
var sortedStudentScores(function () {
return student.scores().sort();
});
如果你要对得分的属性进行排序,你需要使用像
这样的东西var sortFunction = // Google a JavaScript sort function
var studentScores = student.scores().sort(sortFunction);
如果您正在尝试删除项目拼接是正确的(它会转换数组本身),否则您需要使用类似于计算机的内容而不添加最低值。
<强>更新强>
var sortedStudentScores(function () {
// Set a local var equal to the sorted scores
var theseScores = student.scores().sort().splice(0);
theseScores.splice(student.scores().length-2),student.scores().length);
});