2016-02-01 4 views
2

У меня есть этот объект JSON:Удаление объекта из вложенной JQuery JSON массива (сращивания)

{ 
    "Videotheck":[ 
     { 
     "Category":"Comedy", 
     "Title_Liste":[ 
      { 
       "Title":"Millers", 
       "Year":"2014" 
      }, 
      { 
       "Title":"Yogi", 
       "Year":"2012" 
      } 
     ] 
     }, 
     { 
     "Category":"Accion", 
     "Title_Liste":[ 
      { 
       "Title":"Rodulf", 
       "Year":"2014" 
      }, 
      { 
       "Title":"Matrix", 
       "Year":"2000" 
      } 
     ] 
     } 
    ] 
} 

Я пытаюсь удалить объект (элемент) из списка заголовков в категории. Для этого используется функция splice из Javascript. Эта процедура работает хорошо, но только для последнего объекта в списке названий категории. Когда объект в середине списка удален, появляется странное уведомление в консоли. Объект все равно удаляется из массива.

код выглядит следующим образом:

$.each(VT.Videotheck,function(k,v){ 
    if(v.Category == 'Comedy'){ 
     $.each(v.Title_Liste,function(b,z){ 
      if(z.Title == 'Millers'){ 
       v.Title_Liste.splice(b,1); 
      } 
     }); 
    } 
}); 

Уведомление в консоли:

TypeError: z is undefined

И появляется только тогда, когда объект не последний possition хотите удалить. Любая идея, почему эта ошибка появляется

+0

Вы удаляете элементы из массива в то время как вы перекручивание через это? –

+0

Обратите внимание, что формат «JSON», который вы указываете, даже не близок к действительности. –

ответ

1

Мне кажется, что вы удаляете элементы из массива, пока вы все еще прокручиваете его в своем цикле $ .each.

Вам необходимо сохранить ссылку на элементы, которые вы хотите удалить, и соединить их после завершения цикла.

+0

Thx !! Я забыл эту деталь. –

+0

Почему бы не создать новый массив в целом и не сохранить дополнительный цикл? Все, что ему нужно сделать, это заполнить новый массив на основе его критериев и использовать его вместо этого. –

+0

У вас есть пример @ elad.chen? –

1

Следуя за ответом @ Токна. Вот как вы должны фильтровать массив:

var VT = { 
    "Videotheck": [{ 
    "Category": "Comedy", 
    "Title_Liste": [{ 
     "Title": "Millers", 
     "Year": "2014" 
    }, { 
     "Title": "Yogi", 
     "Year": "2012" 
    }] 
    }, { 
    "Category": "Accion", 
    "Title_Liste": [{ 
     "Title": "Rodulf", 
     "Year": "2014" 
    }, { 
     "Title": "Matrix", 
     "Year": "2000" 
    }] 
    }] 
} 

var VT2 = { 
    "Videotheck": [{ 
    "Category": "Comedy", 
    "Title_Liste": [{ 
     "Title": "Millers", 
     "Year": "2014" 
    }, { 
     "Title": "Yogi", 
     "Year": "2012" 
    }] 
    }, { 
    "Category": "Accion", 
    "Title_Liste": [{ 
     "Title": "Rodulf", 
     "Year": "2014" 
    }, { 
     "Title": "Matrix", 
     "Year": "2000" 
    }] 
    }] 
} 

// Example #1: Using native loops is always better.. 
for (var i = 0, l = VT.Videotheck.length; i < l; i++) { 
    var property = VT.Videotheck[i]; 

    if (property.Category === "Comedy") { 
    var dirtyArray = property.Title_Liste; 
    var filteredArray = [], 
     ii = 0, 
     ll = dirtyArray.length; 

     for (; ii < ll; ii++) { 
      var movie = dirtyArray[ii]; 

      if (movie.Title !== "Millers") { 
      filteredArray.push(movie); 
      } 
     } 

    property.Title_Liste = filteredArray;  
    } 
} 

// Example #2: es5 methods/loops 
VT2.Videotheck.forEach(function(element) { 
    if (element.Category === "Comedy") { 
    element.Title_Liste = element.Title_Liste.filter(function(movie) { 
     return movie.Title !== "Millers"; 
    }) 
    } 
}); 

jsFiddle: https://jsfiddle.net/yj4a1rsy/

Смежные вопросы