2016-05-16 78 views
1

我有一个用户数组。indexOf用于不同对象的数组

当我点击按钮“新增”,我想新的对象添加到这个阵列只有doen't存在则有:

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

indexOf总是返回-1

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

enter image description here

+1

您需要用不同的方法识别用户,例如使用ID进行检查。如果'newUser'不是*相同的对象*,那么您总是会得到'-1' –

+0

两个不同的对象不能相等。 – Jai

+0

'Array.prototype.findIndex()' – Redu

回答

1

我每次要调用“新增”,它会工作(硬而不更多的代码来表示)时间假设。原因很简单,newUser的每个实例都是不同的。

indexOf要求检查确切的newUser这个实例。它不检查属性值,只是为了引用实例。

例如:

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 

如果要检查,例如,你将不得不作出一个属性的检查(姓名,身份证,...)

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; 
 
})();

相关问题