Knockout JS:对可观察数字的可观察数组进行排序和拼接

时间:2014-05-06 01:40:34

标签: javascript sorting knockout.js observable ko.observablearray

背景

要学习Knockout JS,我(慢慢地)在浏览器中构建成绩簿。我最近的问题涉及在可观察数组中删除最低分数。我有一个student模型,它有一个名为scores的可观察数组。该数组由可观察的分数组成,这些分数是普通数字。

我删除最低等级的方法如下。首先,我将每个scores数组排序为高 - 低,然后,现在,拼接数组的末尾,使两个最低的数字存储到一个名为low的新数组中。当我计算平均值时,low变量将在稍后使用。

问题

首先,我当前的dropLowestGrades方法彻底删除了dom中的数据,这是我不想要的。其次,myObservableArray.sort()似乎没有进行任何排序!我不知道该往哪里去。相关脚本如下。

  

JSBin http://jsbin.com/fehoq/141/edit

JS

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;
            });
        }; 

HTML

我目前只是将函数绑定到一个按钮。为了简单起见,我将下降硬编码为两个分数。我稍后会允许用户传入一个值。请注意,该按钮的名称为" 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);
    });
};

更新2

我更改了我的StudentModel,使其现在具有属性lowest,用于跟踪用户降低成绩时的最低分数。

var StudentModel = (function () {
    function StudentModel(fullName) {
        var _this = this;
        this.fullName = ko.observable(fullName);
        this.scores = ko.observableArray();
        this.lowest = [];
        ...

1 个答案:

答案 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);
});