Javascript 检查observableArray中是否存在项目
为什么重复的Javascript 检查observableArray中是否存在项目,javascript,knockout.js,Javascript,Knockout.js,为什么重复的Artist检查总是返回false 请参阅此以获得可运行的演示 淘汰码 $(function() { function Artist(name) { this.name = name; } function ViewModel() { var self = this; self.favoriteArtists = ko.observableArray([]); self.artistToAdd = ko.observableArray(
Artist
检查总是返回false
请参阅此以获得可运行的演示
淘汰码
$(function() {
function Artist(name) {
this.name = name;
}
function ViewModel() {
var self = this;
self.favoriteArtists = ko.observableArray([]);
self.artistToAdd = ko.observableArray("");
self.addArtist = function () {
var newFavoriteArtist = new Artist(self.artistToAdd());
console.log("New Favorite Artist: " + newFavoriteArtist.name);
var artistExists = self.favoriteArtists.indexOf(newFavoriteArtist) > 0;
console.log("Artist Exists: " + artistExists);
if(!artistExists) {
self.favoriteArtists.push(newFavoriteArtist);
console.log("A new artist has been added:" + self.artistToAdd());
} else {
console.log("Artist already in favorites.");
}
};
}
ko.applyBindings(new ViewModel());
});
HTML
最喜爱的艺术家
目前,您最喜欢的艺术家包括:
-
输入新艺术家的姓名:
添加
不确定,但是
self.favoriteArtists.indexOf(newFavoriteArtist)>0;
看起来有点奇怪,我想那里应该是a-1。如果你不断添加同一个艺术家,它会一直认为它不存在
你不断地创造新的对象,这些对象不在列表中。(复杂)对象在默认情况下彼此不相等。您的检查应该是以下之一:
self.favoriteArtists.indexOf(newFavoriteArtist) >= 0
self.favoriteArtists.indexOf(newFavoriteArtist) != -1
self.favoriteArtists.indexOf(newFavoriteArtist) > -1
您正在检查它是否大于零。这意味着如果它位于位置0,artistExists
将设置为false
,因为零不大于零
但这仍然不起作用。数组中充满了
Artist
对象,这些对象无法正常搜索,因为您搜索的对象与数组中的对象不同,即使它们具有相同的名称
值。请查看这部分代码:
var newFavoriteArtist = new Artist(self.artistToAdd());
// ...
var artistExists = self.favoriteArtists.indexOf(newFavoriteArtist) > 0;
每次创建新对象时(new Artist
)。然后,您试图在旧对象列表中找到新对象(favoriteArtists
)——而在这里,您的代码无法按预期工作
相反,您可以添加另一个函数,该函数允许您按名称(或其他一些唯一属性)查找艺术家,并澄清此项之前是否已添加。您可以筛选数组并检查其长度是否为零。如果它不是空的,则它包含该项
return favoriteArtists.filter(function(data) {
return data === newFavoriteArtist;
}).length !== 0;
更好的方法是在找到第一个元素后停止迭代,而不是遍历所有集合(因此使用find,而不是filter):
你为什么要使用
observearray
?@KSFT你是对的,self.artistToAdd
应该是ko.observeable(“”)而不是ko.observearray(“”),这就是导致检查总是返回false的原因。好的,但是为什么favoriteArtists
是一个observableArray
而不是一个普通数组?@KSFT I数据绑定html源中的observableArray,以显示数组中Artist
项的列表。Wups,忽略了您的答案。这是正确的。您还可以包括它的代码片段。
return favoriteArtists.find(function(data) {
return data === newFavoriteArtist;
}) !== null;