繁体   English   中英

从数组中删除对象

[英]Remove an object from array

正在尝试从JavaScript对象内的数组列表中删除对象。

对象的结构:

{
    "temp": {
        "name": "",
        "css": {
            "bg_color_main": "#xxxxx",
            "part_bg_color": "xxxxx",
            "txt_font_family": "xxxxxxxx",
            "txt_font_color_main": "#xxxxx",
            "headline_font_family": "xxxxx",
        },
        "part": [
            {
                "name": "xxxxxx",
                "style": {}
            },
            {
                "name": "yyyyyy",
                "style": {}
            },
            {
                "name": "zzzzzz",
                "style": {}
            }
        ]
    }
}

编码:

$.each(jsonData.temp.part, function(k, v) {
     var tt = this; //var tt = $(this)
     if( v.name === partName ){
          delete tt[k];
     }
});

什么都没有发生..没有错误,没有警告!

您的代码中有两个问题。 首先, delete不会删除元素。 只会将它们设置为undefined。 请改用splice

其次,它永远都做不到,因为tt (或this )是您当前正在处理的数组内的对象,而不是您要迭代的数组。 您需要使用其全名来显式访问该数组。

$.each(jsonData.temp.part, function(k, v) {
  var tt = this; //var tt = $(this)
  if( v.name === partName ){
    jsonData.temp.part.splice(k,1);
  }
});

或者,您可以简单地使用过滤器。

var o = {
    "temp": {
        "name": "",
        "css": {
            "bg_color_main": "#xxxxx",
            "part_bg_color": "xxxxx",
            "txt_font_family": "xxxxxxxx",
            "txt_font_color_main": "#xxxxx",
            "headline_font_family": "xxxxx",
        },
        "part": [
            {
                "name": "xxxxxx",
                "style": {}
            },
            {
                "name": "yyyyyy",
                "style": {}
            },
            {
                "name": "zzzzzz",
                "style": {}
            }
        ]
    }
}

o.temp.part = o.temp.part.filter(function (element) {return element.name !== "zzzzzz"});

您可以使用其他方法,例如:

如果不需要该数组的引用,则可以使用reduce来创建一个新数组:

jsonData.temp.part = jsonData.temp.part.reduce(function(acc, value) {
    if( value.name !== partName ){
          acc.push(value);
     }
     return acc;
}, []);

您还可以找到元素的索引,并使用splice维护引用:

var indexElement = jsonData.temp.part.reduce(function(acc, value, index) {
    if( value.name !== partName ){
          return index;
     }
     return acc;
}, -1);

jsonData.temp.part.splice(indexElement, 1)

两种方式都可以。

这是一个可能的解决方案:

最简单的方法是使用删除。

 var jsonData = { "temp": { "name": "", "css": { "bg_color_main": "#xxxxx", "part_bg_color": "xxxxx", "txt_font_family": "xxxxxxxx", "txt_font_color_main": "#xxxxx", "headline_font_family": "xxxxx", }, "part": [ { "name": "xxxxxx", "style": {} }, { "name": "yyyyyy", "style": {} }, { "name": "zzzzzz", "style": {} } ] } } var nameToRemove = 'xxxxxx'; var parts = jsonData.temp.part; $.each(parts, function(k, v) { if (v.name === nameToRemove) { delete parts[k]; } }); //this code is added to just show the result $.each(parts, function(i, r){ if (r != undefined) { $('#result').append(r.name + ',') } }); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <label id="result"></label> 

您创建了一个副本并从副本中删除了项目。

$.each(jsonData.temp.part, function(k, v) {
    var tt = this; // now you created a new array!!!
    if( v.name === partName ){
         delete tt[k]; // here you delete the item from the copy array
         delete this[k]; // you remove item from the original array
    }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM