Javascript 在敲除JS中访问普通JS数组中的可观察值? 背景
我有一个简单的JS数组,最初是空的。我后来用值填充它。发送给它的值是可忽略的可观察数字。稍后,我想将这些值与另一个可忽略的可观察数组中的值进行比较。我的问题是,每当我在数组循环中传递当前项的索引,并传递该索引值(一个数字!),数组就会返回一个函数。要想知道,请看下面的JS 请注意,我的项目和实际脚本可以在JSBin上查看。此外,要在控制台中查看问题,必须添加分配,然后按“排序” JSBin: JS 更新 如果我使用的方法是正确的(?),也许有人会注意到我遗漏了什么 更新2 以防万一我的问题还没有解决,其他人就到这里来了。下面的代码是如何设置Javascript 在敲除JS中访问普通JS数组中的可观察值? 背景,javascript,html,knockout.js,ko.observablearray,Javascript,Html,Knockout.js,Ko.observablearray,我有一个简单的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]);
,控制台打印一个函数。您现在可以在我的帖子中查看完整的、麻烦的方法。实际上,您的代码和我的代码之间存在差异,尽管我不确定这是否重要。myjsTest
中有可观察的内容,而不是简单的字符串或数字。发布的测试代码包含一系列可观察的项目。
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);