indexOf用于具有不同对象的数组

时间:2016-05-16 11:56:07

标签: javascript arrays angularjs indexof

我有一系列用户。

当我点击“添加新”按钮时,我想在这个数组中不存在的情况下添加新对象:

var newUser = { 'creating': true, 'editMode': true };
if ($scope.users.indexOf(newUser) < 0) {
    $scope.users.push(newUser);
}

indexOf始终返回-1

这是因为数组包含“不同”的对象吗?

enter image description here

2 个答案:

答案 0 :(得分:1)

我想每次你打电话给#34;添加新的&#34;,它都会工作(很难说没有更多的代码)。原因很简单,newUser的每个实例都是不同的。

indexOf次调用会检查此newUser的实例。它不会检查属性值,只是为了对实例的引用。

e.g。 :

var user = {a : "b"};
var users = [];
users.push(user);
users.indexOf(user); // returns 0, reference the user created at the top, inserted beforehand
user = {a : "b"};
users.indexOf(user); // returns -1, reference the user created just above, not yet inserted

如果您想检查一下,您必须检查一个属性(名称,ID,......)

答案 1 :(得分:0)

如果您想拥有唯一值的集合,则应使用ECMASCRIPT-6 Set

如果你需要留下遗产,否则你需要使用数组......

var Set = (function() {
  function Set() {}
  
  Set.prototype.has = function(val) {
    return !!this._list.filter(i => i.id === val.id).length;
  };
  
  Set.prototype.get = function(val) {
    if(!val) {
      return this._list;
    }
    
    return this._list.filter(i => i.id === val.id).pop();
  };
  
  Set.prototype.add = function(val) {
    if(!this.has(val)) {
      this._list.push(val)
    }
    
    return this;
  }
  
  return Set;
})();