[英]Remove object from array of objects
我有一个对象数组:
[{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}]
如何删除此项{"value":"14","label":"7"}
导致新数组:
[{"value":"14","label":"7"},{"value":"18","label":"7"}]
?
在ES6中(或使用es6-shim ),您可以使用Array.prototype.findIndex和Array.prototype.splice :
arr.splice(arr.findIndex(matchesEl), 1);
function matchesEl(el) {
return el.value === '14' && el.label === '7';
}
或者如果数组的副本没问题(并且从ES5开始可用),那么Array.prototype.filter就是这样的:
var withoutEl = arr.filter(function (el) { return !matchesEl(el); });
如果您有对象标识而不仅仅是对象相等(即您尝试从数组中删除特定对象,而不仅仅是包含与现有对象相同数据的对象),您可以使用splice和indexOf非常简单地执行此操作:
a = {x:1}
b = {x:2}
arr = [a,b]
假设您要删除b:
arr.splice(
arr.indexOf(b), 1
);
这个问题使人们不清楚我们是在处理身份还是平等问题。 如果你有相等(两个对象包含相同的东西,看起来彼此相同,但实际上不是同一个对象),你需要一个小比较函数,我们可以传递给findIndex。
a = {x: 1};
b = {x: 2};
arr = [a, b];
现在我们要删除c,它等于但不同于:
c = {x: 1}
arr.splice(
arr.findIndex(
(i) => i.x === c.x
), 1
);
请注意,我在这里传递ES6样式lambda函数作为findIndex的第一个参数。
除非您只为常青浏览器编写文章,否则您可能希望使用像Babel这样的转换程序来使用此解决方案。
如果您关心不变性,并且想要返回一个新数组,则可以使用filter进行:
a = {x: 1};
b = {x: 2};
arr = [a, b];
让我们保留一切不是:
newArr = arr.filter((x) => x != a)
尝试:
var ar = [{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}];
for(var i=0; i < ar.length; i++) {
if(ar[i].value == "14" && ar[i].label == "7")
{
ar.splice(i,1);
}
}
如果您不想改变数组,只需使用filter方法, Array.prototype.filter()
array.filter((i)=> i != "b");
我会创建一个新的数组......
var original = [{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}]
var result = [];
for (var i = 0, l = original.length; i < l; i++) { // Traverse the whole array
var current = original[i];
if (! (current.value == 14 && current.label == 7) ) {
// It doesn't match the criteria, so add it to result
result.push( current );
}
}
编辑:我再次阅读了您的问题。 你只想删除第一个元素? 然后使用slice
只获取数组的一部分。
var result = original.slice(1, original.length)
或splice
original.splice(0,1); // Remove one element from index 0.
这是一种在没有“创建新数组”或使用外部库的情况下执行此操作的方法。 请注意,这只会删除找到的第一个实例,而不是重复项,如问题示例中所述。
// Array to search
var arr = [{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}];
// Object to remove from arr
var remove = {"value":"14","label":"7"};
// Function to determine if two objects are equal by comparing
// their value and label properties
var isEqual = function(o1, o2) {
return o1 === o2 ||
(o1 != null && o2 != null &&
o1.value === o2.value &&
o1.label === o2.label);
};
// Iterate through array and determine if remove is in arr
var found = false;
var i;
for(i = 0; i < arr.length; ++i) {
if(isEqual(arr[i], remove)) {
found = true;
break;
}
}
if(found) {
// Found remove in arr, remove it
arr.splice(i, 1);
}
使用ES6方法:
const objIndex = objs.findIndex(o => o.value === '14' && o.label === '7')
if(objIndex > -1) {
objs.slice(objIndex, 1)
}
你需要保留重复的对象吗?
使用下划线.JS
var oldarray = [{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}]
var newarray = _.reject(oldarray, function(o) {
return o == {"value":"14","label":"7"};
});
function removeDuplicateObject (arr) {
let temp = arr.map((item) => {
return JSON.stringify(item);
});
temp = Array.from(new Set(temp));
return temp.map((item) => {
return JSON.parse(item);
});
}
然后removeDuplicateObject(your array)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.