从具有特定键值的数组中删除所有对象
Remove all objects from array with a specific key value
我已经苦苦挣扎了一天,实际上是一整天都在搜索整个 Whosebug 和 google 试图解决这个问题,但我很绝望。
我已经尝试了数十种解决方案,但其中 none 似乎有效...
我有一个对象数组,其中每个对象都有一个名为 pid 且具有特定值的键。
现在我想删除所有具有相同特定 pid 值的对象。
我试过了
forEach, filter, $.each, $.grep
和许多其他函数试图解决这个问题,但都没有成功(或者我每次都做错了什么?)
简单地说,我想删除每个具有特定 pid 值的对象。我当前的代码是:
$.each(cart, function(i){
if(cart[i].pid === pid){
cart.splice(i,1);
}
});
但是这个一直在抛出:无法读取 属性 未定义的 pid
其他函数仅删除(随机?)数量的对象,数组中仍有一些遗留物具有不需要的 pid 值。
我不一定要坚持使用 $.each
函数,因此非常感谢任何解决方案。
Array of objects:
[{"id":1523898500862,"amm":1,"type":"t","name":"bluecheese","pid":1523898494726,"cost":0.5},{"id":1523898501937,"amm":1,"type":"t","name":"edam","pid":1523898494726,"cost":0.5},{"id":1523898505766,"amm":1,"type":"t","name":"mozzarella","pid":1523898494726,"cost":1}]
如您所见,所有三个对象都具有相同的 pid 值,我想根据 pid 将它们全部删除
filter()
是您的解决方案。它采用回调作为参数,决定元素是否应保留在数组中,returns 过滤后的数组。
function remove(arr, pid) {
return arr.filter(e => e.pid !== pid);
}
let arr = [{ pid: 1 }, { pid: 2 }];
console.log("Removed pid:1", remove(arr, 1));
console.log("Removed pid:2", remove(arr, 2));
console.log("Removed pid:3", remove(arr, 3));
let yourArr = [{
"id": 1523898500862,
"amm": 1,
"type": "t",
"name": "bluecheese",
"pid": 1523898494726,
"cost": 0.5
}, {
"id": 1523898501937,
"amm": 1,
"type": "t",
"name": "edam",
"pid": 1523898494726,
"cost": 0.5
}, {
"id": 1523898505766,
"amm": 1,
"type": "t",
"name": "mozzarella",
"pid": 1523898494726,
"cost": 1
}];
console.log("Removed from your array", remove(yourArr, 1523898494726));
这是一个简单的方法,它可以避免迭代时修改的任何困难,并且可以在良好的旧 O(n) 中良好运行:
var removeByPid = function(cart, pid) {
var result = [];
for (var i = 0, len = cart.length; i < len; i++)
if (cart[i].pid !== pid) result.push(cart);
return result;
};
现在你可以说:
var cart = /* ... get values for cart somehow ... */
// ... Do more stuff ...
cart = removeByPid(cart, 1234);
我已经苦苦挣扎了一天,实际上是一整天都在搜索整个 Whosebug 和 google 试图解决这个问题,但我很绝望。 我已经尝试了数十种解决方案,但其中 none 似乎有效...
我有一个对象数组,其中每个对象都有一个名为 pid 且具有特定值的键。 现在我想删除所有具有相同特定 pid 值的对象。
我试过了
forEach, filter, $.each, $.grep
和许多其他函数试图解决这个问题,但都没有成功(或者我每次都做错了什么?)
简单地说,我想删除每个具有特定 pid 值的对象。我当前的代码是:
$.each(cart, function(i){
if(cart[i].pid === pid){
cart.splice(i,1);
}
});
但是这个一直在抛出:无法读取 属性 未定义的 pid
其他函数仅删除(随机?)数量的对象,数组中仍有一些遗留物具有不需要的 pid 值。
我不一定要坚持使用 $.each
函数,因此非常感谢任何解决方案。
Array of objects:
[{"id":1523898500862,"amm":1,"type":"t","name":"bluecheese","pid":1523898494726,"cost":0.5},{"id":1523898501937,"amm":1,"type":"t","name":"edam","pid":1523898494726,"cost":0.5},{"id":1523898505766,"amm":1,"type":"t","name":"mozzarella","pid":1523898494726,"cost":1}]
如您所见,所有三个对象都具有相同的 pid 值,我想根据 pid 将它们全部删除
filter()
是您的解决方案。它采用回调作为参数,决定元素是否应保留在数组中,returns 过滤后的数组。
function remove(arr, pid) {
return arr.filter(e => e.pid !== pid);
}
let arr = [{ pid: 1 }, { pid: 2 }];
console.log("Removed pid:1", remove(arr, 1));
console.log("Removed pid:2", remove(arr, 2));
console.log("Removed pid:3", remove(arr, 3));
let yourArr = [{
"id": 1523898500862,
"amm": 1,
"type": "t",
"name": "bluecheese",
"pid": 1523898494726,
"cost": 0.5
}, {
"id": 1523898501937,
"amm": 1,
"type": "t",
"name": "edam",
"pid": 1523898494726,
"cost": 0.5
}, {
"id": 1523898505766,
"amm": 1,
"type": "t",
"name": "mozzarella",
"pid": 1523898494726,
"cost": 1
}];
console.log("Removed from your array", remove(yourArr, 1523898494726));
这是一个简单的方法,它可以避免迭代时修改的任何困难,并且可以在良好的旧 O(n) 中良好运行:
var removeByPid = function(cart, pid) {
var result = [];
for (var i = 0, len = cart.length; i < len; i++)
if (cart[i].pid !== pid) result.push(cart);
return result;
};
现在你可以说:
var cart = /* ... get values for cart somehow ... */
// ... Do more stuff ...
cart = removeByPid(cart, 1234);