通过值从数组中删除一个项目

12
我有一个类似这样的项目数组:
var items = [id: "animal", type: "cat", cute: "yes"]

我想要移除与给定 ID 匹配的任何项。在这个例子中是 animal

我卡住了!我可以很容易地通过使用一个更简单的数组来让它工作,但这不是我需要的... 我还需要根据值删除项,因为我不想通过引用它们的索引来处理麻烦。

有没有一种 jQuery 方法可以让我不需要遍历整个数组,而是指定一个选择器?

这是我的 jsFiddle:http://jsfiddle.net/zafrX/


4
您的语法无效。您有一个数组还是对象?您混合了语法。 - James Montagne
1
如果你查看 JavaScript 控制台(在我的情况下是 Firebug),它会提示错误:“Uncaught SyntaxError: Unexpected token :”。 你应该创建一个 Item 对象,这样你就能轻松访问 Item 的属性了。 - Jeremy D
1
对象 var items = { id: "animal", type: "cat", cute: "yes" },数组 var items = ["animal", "cat", "yes" ] - Lautaro Orazi
1
我的错!我会将其移除。 - Afshin Moazami
9个回答

27

我不确定通过索引引用数组项是否会有多大的麻烦。删除数组项的标准方法是使用splice方法

for (var i = 0; i < items.length; i++)
    if (items[i] === "animal") { 
        items.splice(i, 1);
        break;
    }

当然,你可以将这个通用代码转化为帮助函数,这样你就不必在每个地方都重复它。


编辑

我刚注意到这个错误的语法:

var items = [id: "animal", type: "cat", cute: "yes"]

你是想要这样的效果吗:

 var items = [ {id: "animal",  type: "cat", cute: "yes"}, {id: "mouse",  type: "rodent", cute: "no"}];

这会将删除代码更改为:

for (var i = 0; i < items.length; i++)
    if (items[i].id && items[i].id === "animal") { 
        items.splice(i, 1);
        break;
    }

1
items.splice(items.indexOf("animals"), 1) 删掉“animals”这个项。 - Paully

11

现在我们不需要使用jQuery或任何第三方库,可以使用新的ES5过滤器:

let myArray = [{ id : 'a1', name : 'Rabbit'}, { id : 'a2', name : 'Cat'}];
myArray = myArray.filter(i => i.id !== 'a1');

6
您可以使用 splice 或自行运行删除操作。以下是一个示例:
for (var i = 0; i < items.length; i ++) {
    if (items[i] == "animal") { 
        items.splice(i, 1);
        break;
    }
}

5

有一个简单的方法!

myItems.splice(myItems.indexOf(myItems.find(row => row.id == id)), 1);

以下是演示:

// define function
function delete_by_id(id) {

  var myItems = [{
    id: 1,
    type: "cat",
    cute: "yes"
  }, {
    id: 2,
    type: "rat",
    cute: "yes"
  }, {
    id: 3,
    type: "mouse",
    cute: "yes"
  }];

  // before
  console.log(myItems);

  myItems.splice(myItems.indexOf(myItems.find(item => item.id == id)), 1);

  // after 
  console.log(myItems);

}

// call function
delete_by_id(1);


3

您应该这样做(确保您拥有正确的语法...您不能使用带有属性的数组,但是在{}内部使用对象,然后可以按键迭代并删除不需要的键):

var items = {id: "animal", type: "cat", cute: "yes"}
var removeItem = "animal"; // or with the ID matching animal...

for(var p in items){
    if(items[p] === removeItem)
        delete items[p]
}

回答你的问题,你不能将jquery选择器应用于javascript对象。为了避免使用for循环,最好的方法是使用$.each(这是一种以更“函数式”的方式编写的循环)。


我认为这可能是正确的答案。我错过了OP的错误语法。 - Adam Rackis

2
通过使用对象表示法:http://jsfiddle.net/jrm2k6/zafrX/2/
var animal1 = {id: "animal", type: "cat", cute: "yes"}
var car2 = {id: "car", type: "pick-up", cute: "no"}
var animal3 = {id: "animal", type: "dog", cute: "yes"}
var removeItem = "animal"; // or with the ID matching animal...

var array_items = []
array_items.push(animal1);
array_items.push(car2);
array_items.push(animal3);

for(var i=0;i<array_items.length;i++){
    if(array_items[i].id == removeItem){
        array_items.splice(i,1);
    }
}

//alert(array_items.length);  

0

哇,有很多想法,但还不是我想要的 xD

这将删除给定值的所有条目并返回已删除的值:

function removeOfArray(val, arr){
    var idx;
    var ret;
    while ((idx = arr.indexOf(val)) > -1){
        arr.splice(idx, 1);
        ret = val;
    }
    return ret;
}

我在这里还发现了其他解决方案: 按值从数组中删除项目


0

ES6 解决方案

persons.splice(persons.findIndex((pm) => pm.id === personToDelete.id), 1);

0
-parray : list of array of object
-pstring :value to remove from the array
-ptag :using which tag we

function removeFromArr (parray,ptag,pstring){
 var b =[];
var count = 0;
for (var i =0;i<parray.length;i++){
 if(pstring != parray[i][ptag]){
 b[count] = parray[i];
 count++;
 }
}
 return b;
}

var lobj = [ {
 "SCHEME_CODE": "MIP65",
 "YEARS": "1",
 "CURRENCY": "GBP",
 "MAX_AMT": 200000,
 "MIN_AMT": 1000,
 "AER_IR": "1.80",
 "FREQUENCY": "Monthly",
 "CUST_TYPE": "RETAIL",
 "GROSS_IR": "1.79"
 },
 {
 "SCHEME_CODE": "MIP65",
 "YEARS": "2",
 "CURRENCY": "GBP",
 "MAX_AMT": 200000,
 "MIN_AMT": 1000,
 "AER_IR": "1.98",
 "FREQUENCY": "Monthly",
 "CUST_TYPE": "RETAIL",
 "GROSS_IR": "1.96"
 },
 {
 "SCHEME_CODE": "MIP65",
 "YEARS": "3",
 "CURRENCY": "GBP",
 "MAX_AMT": 200000,
 "MIN_AMT": 1000,
 "AER_IR": "2.05",
 "FREQUENCY": "Monthly",
 "CUST_TYPE": "RETAIL",
 "GROSS_IR": "2.03"
 },
 {
 "SCHEME_CODE": "MIP65",
 "YEARS": "5",
 "CURRENCY": "GBP",
 "MAX_AMT": 200000,
 "MIN_AMT": 1000,
 "AER_IR": "2.26",
 "FREQUENCY": "Monthly",
 "CUST_TYPE": "RETAIL",
 "GROSS_IR": "2.24"
 },
 {
 "SCHEME_CODE": "QIP65",
 "YEARS": "1",
 "CURRENCY": "GBP",
 "MAX_AMT": 200000,
 "MIN_AMT": 1000,
 "AER_IR": "1.80",
 "FREQUENCY": "Quarterly",
 "CUST_TYPE": "RETAIL",
 "GROSS_IR": "1.79"
 },
 {
 "SCHEME_CODE": "QIP65",
 "YEARS": "2",
 "CURRENCY": "GBP",
 "MAX_AMT": 200000,
 "MIN_AMT": 1000,
 "AER_IR": "1.98",
 "FREQUENCY": "Quarterly",
 "CUST_TYPE": "RETAIL",
 "GROSS_IR": "1.97"
 },
]

function myFunction(){
 var final = removeFromArr(lobj,"SCHEME_CODE","MIP65");
 console.log(final);
}
<html>
<button onclick="myFunction()">Click me</button>
</html>

将从对象中移除

function removeFromArr(parray, pstring, ptag) {
        var farr = [];
        var count = 0;
        for (var i = 0; i < pa.length; i++) {
            if (pstring != pa[i][ptag]) {
                farr[count] = pa[i];
                count++;
            }
        }
        return farr;
    }

1
请在您的帖子中包含解释如何以及为什么解决问题,这将有助于提高质量。 - Saeed Zhiany

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接