Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在敲除JS中访问普通JS数组中的可观察值? 背景_Javascript_Html_Knockout.js_Ko.observablearray - Fatal编程技术网

Javascript 在敲除JS中访问普通JS数组中的可观察值? 背景

Javascript 在敲除JS中访问普通JS数组中的可观察值? 背景,javascript,html,knockout.js,ko.observablearray,Javascript,Html,Knockout.js,Ko.observablearray,我有一个简单的JS数组,最初是空的。我后来用值填充它。发送给它的值是可忽略的可观察数字。稍后,我想将这些值与另一个可忽略的可观察数组中的值进行比较。我的问题是,每当我在数组循环中传递当前项的索引,并传递该索引值(一个数字!),数组就会返回一个函数。要想知道,请看下面的JS 请注意,我的项目和实际脚本可以在JSBin上查看。此外,要在控制台中查看问题,必须添加分配,然后按“排序” JSBin: JS 更新 如果我使用的方法是正确的(?),也许有人会注意到我遗漏了什么 更新2 以防万一我的问题还没有

我有一个简单的JS数组,最初是空的。我后来用值填充它。发送给它的值是可忽略的可观察数字。稍后,我想将这些值与另一个可忽略的可观察数组中的值进行比较。我的问题是,每当我在数组循环中传递当前项的索引,并传递该索引值(一个数字!),数组就会返回一个函数。要想知道,请看下面的JS

请注意,我的项目和实际脚本可以在JSBin上查看。此外,要在控制台中查看问题,必须添加分配,然后按“排序”

JSBin

JS 更新 如果我使用的方法是正确的(?),也许有人会注意到我遗漏了什么

更新2 以防万一我的问题还没有解决,其他人就到这里来了。下面的代码是如何设置
最低值的:

this.dropLowestScores = function() {
    ko.utils.arrayForEach(_this.students(), function(student){
        var comparator = function(a,b){
          if(a()<b()){
            return 1;
          } else if(a() > b()){
            return -1;
          } else {
            return 0;
          }
        };       
        var tmp = student.scores().slice(0);
        tmp.sort(comparator);
        student.lowest = ko.observableArray(tmp.splice((tmp.length-2),tmp.length-1));
    });
};
this.dropLowestScores=函数(){
ko.utils.arrayForEach(_this.students(),函数(student){
var比较器=功能(a,b){
如果(a()b()){
返回-1;
}否则{
返回0;
}
};       
var tmp=student.scores().slice(0);
排序(比较器);
student.lowest=ko.observableArray(tmp.拼接((tmp.长度-2),tmp.长度-1));
});
};
悬而未决的问题,5/9/2014
  • 杰里米的脚本运行,但没有预期的效果。例如,
    console.log(_this.lower[k])
    打印
    未定义的
    ,就像我的一样。此外,匹配的分数不会被跳过,它们应该被跳过

  • Jeremy的脚本将
    最低的
    指定为ko.observable。我的脚本现在也有了最低的ko.observable,但是为什么一个普通的JS数组不适合这个呢?我只需要
    lower
    在单击绑定到的按钮时进行更新,并且这些绑定已经处理好了


  • 这就是在淘汰赛中观察到的结果

    创建一个函数时,就是在创建一个函数

    var myObservable1 = ko.observable(); // Create it.
    var myObservable2 = ko.observable("Hola!"); // Create it with a value.
    
    console.log(typeof myObservable2); // It is indeed a function
    console.log(typeof myObservable2()); // That returns a string
    console.log(myObservable2()); // And get the value.
    
    根据评论中的问题进行编辑

    var koTest = ko.observableArray();
    koTest.push("Line0");
    koTest.push("Line1");
    koTest.push("Line2");
    koTest.push("Line3");
    koTest.push("Line4");
    
    var jsTest = [];
    jsTest.push("Line0");
    jsTest.push("Line1");
    jsTest.push("Line2");
    jsTest.push("Line3");
    jsTest.push("Line4");
    
    
    alert(koTest()[2]);
    alert(jsTest[2]);
    alert(koTest()[2] === jsTest[2]);
    
    测试代码

    我对你的代码进行了一次可运行的测试,一切都很顺利。我不得不对
    \u this
    的内容做出一些假设——特别是
    最低
    的声明,我根据您访问它的方式制作了一个
    可观察的RAY

    无论如何,这段代码运行:

        var _this = {
            scores: ko.observableArray(),
            lowest: ko.observableArray()
        };
    
    
        var mean = (function(scores) {
            var m = 0;
            var count = 0;
            var k;
    
    
            ko.utils.arrayForEach(_this.scores(), function(score) {
    
                console.log([typeof score(), score()]);
    
                if (!isNaN(parseFloat(score()))) {
                    k = _this.scores.indexOf(score);
                    console.log(k);
                    console.log(_this.lowest[k]);
                    if (score() != _this.lowest[k]) {
                        m += parseFloat(score());
                        count += 1;
                    }
    
                }
    
    
            });
    
    
            if (count) {
                m = m / count;
                return m.toFixed(2);
            } else {
                return 'N/A';
            }
        });
    
        for (var i = 0; i < 10; i++) {
            _this.scores.push(ko.observable(i));
        }
    
        var m = mean();
        alert(m);
    
    var\u此={
    分数:ko.observearray(),
    最低:ko.observableArray()
    };
    var平均值=(函数(分数){
    var m=0;
    var计数=0;
    var-k;
    ko.utils.arrayForEach(_this.scores(),函数(score){
    log([typeof score(),score()]);
    如果(!isNaN(parseFloat(score())){
    k=_this.scores.indexOf(score);
    控制台日志(k);
    console.log(_this.lower[k]);
    如果(分数()!=\u这个最低[k]){
    m+=parseFloat(score());
    计数+=1;
    }
    }
    });
    如果(计数){
    m=m/计数;
    返回m.toFixed(2);
    }否则{
    返回“不适用”;
    }
    });
    对于(变量i=0;i<10;i++){
    _这个。得分。推(ko。可观察(i));
    }
    var m=平均值();
    警报(m);
    
    假设你有两个相同的分数。您的索引
    k
    将中断。方法
    ko.utils.arrayForEach
    中有一个额外的参数
    ko.utils.arrayForEach(_this.scores(),function(score,k){
    So this.lowest是包含可观察对象的“普通JS数组”吗?如果是的话,你需要调用该函数从可观察对象中获取数字。但是我觉得你已经知道了这一点,所以可能我误解了什么。_this.lowest[k]()是一个函数吗???我知道对于敲除,值是通过
    myObservable()
    来检索的。但是我在这里似乎无法做到这一点。
    k
    是一个数字。
    \u this.loost[k]
    返回一个函数。
    \u this.loost[k](
    )和
    \u this.loost[k()]
    。我在语法上遗漏了一些东西,但我不确定是什么!我也没有遇到过为
    k
    设置值的问题。当我将其作为索引传递时,我遇到了问题。同样,根据我的控制台日志,
    k
    是一个数字。好的,我没有输出。现在如何正确地打印数组中给定索引处的可观测值?
    jsArray[k]
    jsArray[k()]
    jsArray[k]()
    jsArray()[k]
    jsArray()[k]()
    all返回函数或错误。仅供参考,我对所有这些都不起作用并不感到惊讶,我只是不知道应该做什么。@Jefftopia添加了一个示例这对我来说完全有意义,这正是我所期望的。但是,当我执行以下操作时,
    console.log(\u this.lost[k]);
    ,控制台打印一个函数。您现在可以在我的帖子中查看完整的、麻烦的方法。实际上,您的代码和我的代码之间存在差异,尽管我不确定这是否重要。my
    jsTest
    中有可观察的内容,而不是简单的字符串或数字。发布的测试代码包含一系列可观察的项目。
    var koTest = ko.observableArray();
    koTest.push("Line0");
    koTest.push("Line1");
    koTest.push("Line2");
    koTest.push("Line3");
    koTest.push("Line4");
    
    var jsTest = [];
    jsTest.push("Line0");
    jsTest.push("Line1");
    jsTest.push("Line2");
    jsTest.push("Line3");
    jsTest.push("Line4");
    
    
    alert(koTest()[2]);
    alert(jsTest[2]);
    alert(koTest()[2] === jsTest[2]);
    
        var _this = {
            scores: ko.observableArray(),
            lowest: ko.observableArray()
        };
    
    
        var mean = (function(scores) {
            var m = 0;
            var count = 0;
            var k;
    
    
            ko.utils.arrayForEach(_this.scores(), function(score) {
    
                console.log([typeof score(), score()]);
    
                if (!isNaN(parseFloat(score()))) {
                    k = _this.scores.indexOf(score);
                    console.log(k);
                    console.log(_this.lowest[k]);
                    if (score() != _this.lowest[k]) {
                        m += parseFloat(score());
                        count += 1;
                    }
    
                }
    
    
            });
    
    
            if (count) {
                m = m / count;
                return m.toFixed(2);
            } else {
                return 'N/A';
            }
        });
    
        for (var i = 0; i < 10; i++) {
            _this.scores.push(ko.observable(i));
        }
    
        var m = mean();
        alert(m);