从数组中删除对象

时间:2015-09-07 19:07:40

标签: javascript jquery json

我正在尝试从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];
     }
});

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

5 个答案:

答案 0 :(得分:3)

您的代码中存在两个问题。首先,delete does not remove elements. It only sets them to undefined. Use 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);
  }
});

答案 1 :(得分: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"});

答案 2 :(得分:0)

您可以使用不同的方法,例如:

如果不需要数组引用,可以使用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)

两种方式都有效。

答案 3 :(得分:0)

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

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



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>
&#13;
&#13;
&#13;

答案 4 :(得分:0)

您从副本中创建了一个复制和删除项目。

$.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
    }
});