我有一个用户数组。indexOf用于不同对象的数组
当我点击按钮“新增”,我想新的对象添加到这个阵列只有doen't存在则有:
var newUser = { 'creating': true, 'editMode': true };
if ($scope.users.indexOf(newUser) < 0) {
$scope.users.push(newUser);
}
但indexOf
总是返回-1
。
这是因为数组包含“不同”的对象?
我有一个用户数组。indexOf用于不同对象的数组
当我点击按钮“新增”,我想新的对象添加到这个阵列只有doen't存在则有:
var newUser = { 'creating': true, 'editMode': true };
if ($scope.users.indexOf(newUser) < 0) {
$scope.users.push(newUser);
}
但indexOf
总是返回-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
如果要检查,例如,你将不得不作出一个属性的检查(姓名,身份证,...)
如果你想有一个收集的独特值你应该使用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;
})();
您需要用不同的方法识别用户,例如使用ID进行检查。如果'newUser'不是*相同的对象*,那么您总是会得到'-1' –
两个不同的对象不能相等。 – Jai
'Array.prototype.findIndex()' – Redu