正在从数组中删除相等的对象
Removing an equal object from array
我有一个颜色数组。我想删除一个等于另一个对象的对象。
阵列
[
{ id: 1, color: "red"},
{ id: 2, color: "blue"},
]
对象
{ id: 2, color: "blue" }
我不知道数组中的index
。理想情况下,它可以是类似array.remove(object)
的东西。
我怎样才能做到这一点?
假设"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;
}
然后在我原来的功能:
if (equalObjects(array[i], item)) {
我在这个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: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;
});
Fiddle:http://jsfiddle.net/AtGnY/14/
类似问题
这至少会让你使用暴力方法来解决你的问题。循环遍历数组,然后比较每个对象。
通过ID查找对象更紧凑、更优雅,但可能与您的需求不匹配。
相关文章:
- 在不知道深度或父属性的情况下从对象中删除属性
- 解析JSON并从中删除对象会出错
- 如何从对象中删除属性
- 在特定条件下从存储在localStorage中的阵列中删除对象
- Es6:能够在设置/更新/删除对象属性时调用自定义方法
- AngularJS:删除重复的对象并按值对数组进行重新排序
- 正在从对象中删除值
- 正在从列表中删除对象
- 删除对象时终止setInterval
- jQuery-检测选择对象是否添加或删除了选项
- 如何在不删除类似侦听器的情况下从父对象中删除jQuery事件侦听器
- 为什么没有从数组中存在的对象中删除属性
- 从Three.js场景中删除许多对象的速度较慢
- 删除两个独立对象中的属性,而不使用多余的删除语句
- JS:将 EventListener 添加到动态创建的 DOM 对象中,这些对象删除 parentNode
- Java 脚本 json 解析对象:删除操作后不删除“,”
- JavaScript对象删除特定键值中的引号
- tinyMCE对象删除事件触发器
- javascript地图对象删除不工作
- Javascript对象删除元素