Javascript 从数组中删除相等对象
我有一系列的颜色。我想删除一个等于另一个对象的对象 排列 反对Javascript 从数组中删除相等对象,javascript,Javascript,我有一系列的颜色。我想删除一个等于另一个对象的对象 排列 反对 { id: 2, color: "blue" } 我不知道数组中的索引。理想情况下,它可能类似于array.removeobject 我怎样才能做到这一点呢?我用这个indexOf解决方案犯了一个错误,但我现在正在纠正自己: function indexOf(arr, val, comparer) { for (var i = 0, len = arr.length; i < len; ++i) {
{ id: 2, color: "blue" }
我不知道数组中的索引。理想情况下,它可能类似于array.removeobject
我怎样才能做到这一点呢?我用这个indexOf解决方案犯了一个错误,但我现在正在纠正自己:
function indexOf(arr, val, comparer) {
for (var i = 0, len = arr.length; i < len; ++i) {
if ( i in arr && comparer(arr[i], val) ) {
return i;
}
}
return -1;
}
var index = indexOf(array,someObject, function(o1,o2) { return o1.id == o2.id && o1.color == o2.color; });
if (index > -1) {
array.splice(index, 1);
}
Fiddle:我在这个解决方案索引上犯了一个错误,但我现在正在纠正自己:
function indexOf(arr, val, comparer) {
for (var i = 0, len = arr.length; i < len; ++i) {
if ( i in arr && comparer(arr[i], val) ) {
return i;
}
}
return -1;
}
var index = indexOf(array,someObject, function(o1,o2) { return o1.id == o2.id && o1.color == o2.color; });
if (index > -1) {
array.splice(index, 1);
}
Fiddle:假设equal意味着拥有相同的id,您只需要一个循环和一个if测试:
function removeItem(array, item) {
for (var i = array.length - 1; i >= 0; i--)
if (array[i].id === item.id) {
array.splice(i, 1);
break; // remove this line if there could be multiple matching elements
}
}
var array = [
{ id: 1, color: "red"},
{ id: 2, color: "blue"},
];
removeItem(array, { id: 2, color : "blue"});
显然,您可以将其扩展以测试这两个属性:
if (array[i].id === item.id && array[i].color === item.color) {
如果您希望能够比较具有未知属性名称的任意对象,那么可以使用嵌套的for..in循环来测试每个属性,或者类似以下未测试的内容,而不是简单的If测试:
function equalObjects(o1, o2) {
var okeys1 = Object.keys(o1);
if (okeys1.length != Object.keys(o2).length)
return false;
for (var i = 0; i < okeys1.length; i++)
if (o1[okeys1[i]] !== o2[okeys1[i]])
return false;
return true;
}
假设equal意味着拥有相同的id,您只需要一个循环和一个if测试:
function removeItem(array, item) {
for (var i = array.length - 1; i >= 0; i--)
if (array[i].id === item.id) {
array.splice(i, 1);
break; // remove this line if there could be multiple matching elements
}
}
var array = [
{ id: 1, color: "red"},
{ id: 2, color: "blue"},
];
removeItem(array, { id: 2, color : "blue"});
显然,您可以将其扩展以测试这两个属性:
if (array[i].id === item.id && array[i].color === item.color) {
如果您希望能够比较具有未知属性名称的任意对象,那么可以使用嵌套的for..in循环来测试每个属性,或者类似以下未测试的内容,而不是简单的If测试:
function equalObjects(o1, o2) {
var okeys1 = Object.keys(o1);
if (okeys1.length != Object.keys(o2).length)
return false;
for (var i = 0; i < okeys1.length; i++)
if (o1[okeys1[i]] !== o2[okeys1[i]])
return false;
return true;
}
这至少可以让你使用暴力方法来解决你的问题。循环遍历数组,然后比较每个对象
更紧凑、更优雅,但可能不符合您的需要
这至少可以让你使用暴力方法来解决你的问题。循环遍历数组,然后比较每个对象
更紧凑、更优雅,但可能不符合您的需要。什么表示两个对象相等?id和颜色属性都必须匹配还是只匹配颜色?两者都更好,但在这个场景中一个就足够了@KeluThatsall Uhh的可能副本,你认为你有错误的链接吗?这只是回到这个问题。两者都更好,但在这个场景中一个就足够了-在您给出的示例中,两个属性都不匹配,只有id。什么指示两个对象相等?id和颜色属性都必须匹配还是只匹配颜色?两者都更好,但在这个场景中一个就足够了@KeluThatsall Uhh的可能副本,你认为你有错误的链接吗?这只是链接回这个问题。两者都更好,但在这个场景中一个就足够了-在您给出的示例中,两个属性都不匹配,只有id。这不起作用。他有一个对象数组,而不是颜色数组。indexOf不会将对象作为参数,这必须是字符串,因此必须先将其放入循环中。@Deryck-。indexOf将接受一个对象,但这仍然不起作用,因为。indexOf使用严格相等,因此它只会删除同一个实例,不是属性设置为相同值的重复对象。嗯,这仍然不起作用。对象不会是==更不用说===仅仅因为它们的键具有相同的值。@Deryck-MDN非常好。只要谷歌[any JS term here]mdn,你就会被设置好。这不起作用。他有一个对象数组,而不是颜色数组。indexOf不会将对象作为参数,这必须是字符串,因此必须先将其放入循环中。@Deryck-。indexOf将接受一个对象,但这仍然不起作用,因为。indexOf使用严格相等,因此它只会删除同一个实例,不是属性设置为相同值的重复对象。嗯,这仍然不起作用。对象不会是==更不用说===仅仅因为它们的键具有相同的值。@Deryck-MDN非常好。只需谷歌[any JS term here]mdn,您就可以进行设置。他还可以通过向array.prototype添加类似的函数来获得所需的array.removeobject语法。@Matt-True。我不喜欢修改内置对象的原型,所以我将把它留给读者作为练习…我同意你的观点。。。我主要是把它作为一个暗示;。他还可以通过向array.prototype添加类似的函数来获得所需的array.removeobject语法。@Matt-True。我不喜欢修改内置对象的原型,所以我将把它留给读者作为练习…我同意你的观点。。。我主要是把它作为一个暗示;。