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;