我有一系列用户。
当我点击“添加新”按钮时,我想在这个数组中不存在的情况下添加新对象:
var newUser = { 'creating': true, 'editMode': true };
if ($scope.users.indexOf(newUser) < 0) {
$scope.users.push(newUser);
}
但indexOf
始终返回-1
。
这是因为数组包含“不同”的对象吗?
答案 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;
})();