【问题标题】:Remove an item from an array by value按值从数组中删除一个项目
【发布时间】:2012-02-11 00:22:53
【问题描述】:

我有一系列项目,例如:

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

我正在尝试删除与给定 ID 匹配的所有项目。在这种情况下; animal

我被困住了!我可以通过拥有一个更简单的数组来轻松地工作,但这不是我需要的......我还需要按值删除项目,因为我不希望通过索引引用项目的麻烦。

有没有一种 jQuery 方法我可以在不需要遍历 items 数组的地方使用,而是指定一个选择器?

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

【问题讨论】:

  • 您的语法无效。你有一个数组还是一个对象?你混合了语法。
  • 如果你查看 javascript 控制台(在我的例子中是 firebug),它会引发错误,'Uncaught SyntaxError: Unexpected token :' 你应该创建一个对象项目,你将能够访问容易的项目属性
  • 对象var items = { id: "animal", type: "cat", cute: "yes" },数组var items = ["animal", "cat", "yes" ]
  • 我的错!我会删除它

标签: javascript jquery arrays each


【解决方案1】:

我不确定按索引引用数组项有多麻烦。删除数组项的标准方法是使用 splice method

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;
    }

【讨论】:

  • items.splice(items.indexOf("animals"), 1)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您可以使用splice 或自己运行删除。这是一个例子:

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

    【讨论】:

      【解决方案4】:

      有一个简单的方法!

      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);

      【讨论】:

        【解决方案5】:

        你应该这样做(确保你有正确的语法......你不能有带有属性的数组,而是{}中的对象,然后你可以通过键迭代并删除不需要的键):

        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 的错误语法。
        【解决方案6】:

        使用对象表示法: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);  
        

        【讨论】:

          【解决方案7】:

          哇,这么多想法,但仍然不是我想要的xD

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

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

          我还在这里找到了其他解决方案: Remove item from array by value

          【讨论】:

            【解决方案8】:
            -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;
                }
            

            【讨论】:

            • 请说明如何以及为什么解决问题将真正有助于提高您的帖子质量。
            【解决方案9】:

            ES6 解决方案

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

            【讨论】:

              猜你喜欢
              • 2019-10-03
              • 1970-01-01
              • 1970-01-01
              • 2011-04-26
              • 1970-01-01
              • 1970-01-01
              • 2021-10-22
              • 2016-10-05
              相关资源
              最近更新 更多