背景
我有一个普通的JS数组,最初是空的。我稍后用值填充它。发送给它的值是可观察到的数字。稍后,我想将这些值与另一个可剔除的可观察数组中的值进行比较。我的问题是,每当我在数组循环中传递当前项目的索引并传递该索引值(一个数字!)时,该数组就会返回一个函数。要了解一个想法,请查看下面的JS。
请注意,我的项目和实际脚本在JSBin上可见。此外,要在控制台中查看问题,您必须添加分配,然后按“排序”。
JSBin:http://jsbin.com/fehoq/177/edit] 1
JS
//example script that follows actual script
var _this = this;
//initialize my array
this. lowest = [];
// I want to compare values in lowest to values in this array
this.scores = ko.observableArray();
// method that does comparison
this.myMethod = function(){
// initialize my helper, k
var k;
...
// loop through one array
ko.utils.arrayForEach(_this.scores(), function (score) {
// make sure my value is a number...
if (!isNaN(parseFloat(score()))) {
// this is important, I need to current index for comparison
k = _this.scores.indexOf(score);
console.log(k);
// this is where things break - it prints a function, not a value!
console.log(_this.lowest[k]);
// useless check, the value is a function, so they're always different
if (score()!=_this.lowest[k]){
// do stuff
}
}
}
}
更新资料
放入我正在使用的方法,也许有人会注意到我的语法是正确的吗?
this.mean = (function(scores,i) {
var m = 0;
var count = 0;
var k;
ko.utils.arrayForEach(_this.scores(), function(score) {
console.log([typeof score(), score()]);
if (!isNaN(parseFloat(score()))) {
console.log(i);
console.log(_this.lowest[i]);
if (score() != _this.lowest[i]) {
m += parseFloat(score());
count += 1;
}
}
});
if (count) {
m = m / count;
return m.toFixed(2);
} else {
return 'N/A';
}
});
}
更新2
万一有人徘徊在这里,因为我的问题仍然没有解决。以下代码是我设置
lowest
值的方法: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));
});
};
待解决的问题,2014年5月9日
Jeremy的脚本运行,但没有预期的效果。例如,与我的一样,
console.log(_this.lowest[k])
打印undefined
。此外,匹配的分数不会被跳过,而是应该被跳过。Jeremy的脚本将
lowest
指定为ko.observable。我的脚本现在还具有lowest
作为ko.observable,但是为什么普通的JS数组不应该这样做呢?单击绑定到的按钮时,我只需要lowest
更新,并且这些绑定已经处理完毕。 最佳答案
这就是可观察性在淘汰赛中的工作方式。
创建一个函数时,就是在创建一个函数。
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]);
测试代码
我继续对您的代码进行了可运行的测试,一切对我来说都很好。我必须对
_this
的内容做出一些假设-特别是lowest
的声明,我根据您访问它的方式制作了observableArray
。无论如何,此代码运行:
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);