我有一系列颜色。我想删除一个等于另一个对象的文件。
阵列
[
{ id: 1, color: "red"},
{ id: 2, color: "blue"},
]
对象
{ id: 2, color: "blue" }
我不知道数组中的index
。理想情况下,它可能类似于array.remove(object)
。
我怎样才能做到这一点?
答案 0 :(得分:3)
假设“相等”意味着“拥有相同的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) {
如果您希望能够比较具有未知属性名称的任意对象,那么您可以使用嵌套的if
循环来测试每个属性,或者像这样的东西,而不是简单的for..in
测试。未测试的):
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;
}
然后在我的原始函数中:
if (equalObjects(array[i], item)) {
答案 1 :(得分:2)
我对这个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);
}
小提琴:http://jsfiddle.net/AtGnY/5/
如果您希望以这种方式调用它:array.remove(object)
那么您可以像这样编写此代码:
Array.prototype.remove = function (object, comparer) {
if (!comparer) {
comparer = function (o1, o2) {
return o1 === o2;
};
}
var index = -1;
for (var i = 0, len = this.length; i < len; ++i) {
if (i in this && comparer(this[i], object)) {
index = i;
}
}
if (index > -1) {
array.splice(index, 1);
}
};
array.remove(object, function (o1, o2) {
return o1.id == o2.id && o1.color == o2.color;
});
答案 2 :(得分:0)