2016-04-29 2 views
-1

Я пытаюсь перебрать элементы внутри объекта и удалить элементы со значением delete, значение которого истинно, чтобы затем отправить этот объект в качестве данных.Удаление элементов из массива javascript приводит к ошибке

Когда я использую сплайсинг для удаления элемента, я получаю Uncaught TypeError: Не могу прочитать свойство «удалить» неопределенной ошибки. Почему это?

https://jsfiddle.net/ah9td94q/3/

var data = { 
    "stuff":[ 
     {"x":0}, 
     {"y":1, "delete": true}, 
     {"z":2, "delete": true} 
    ] 
} 

Object.keys(data.stuff).forEach(function (key) { 
    if (data.stuff[key].delete == true) { 
    data.stuff.splice(key, 1); 
    } 
}); 

var postData = JSON.stringify({something:'something', data: data}); 
console.log(postData); 
+1

[Связанный, возможно, обман?] (Http://stackoverflow.com/questions/500606/javascript-array-delete-elements) Обратите внимание, что вы пытаетесь удалить элементы в массиве, а не удалять свойства объекта , –

+1

'delete()' делает это для массивов, делающих их разреженными и трудными для решения. Я считаю, что причина, по которой нам нужен такой тип поведения, - это частичные данные, и вам нужно заполнить пустые области таблицы. Используйте 'pop' или' shift'https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete#Deleting_array_elements – zer00ne

+0

Когда вы используете ключевое слово delete для удаления элемента из массива, он фактически заменяется нулевым значением. Это то, что происходит в вашей ситуации. См. [Этот ответ] (http://stackoverflow.com/a/12469043/5423708) для лучшего объяснения. Он предлагает решение, но обязательно просмотрите комментарии и для большего контекста. –

ответ

3
var data = { 
    "stuff":[ 
     {"x":0}, 
     {"y":1, "delete": true}, 
     {"z":2, "delete": true} 
    ] 
} 

Object.keys(data.stuff).reverse().forEach(function (key) { 
    if (data.stuff[key].delete == true) { 
    data.stuff.splice(key, 1); 
    } 
}); 

var postData = JSON.stringify({something:'something', data: data}); 
console.log(postData); 

https://jsfiddle.net/ah9td94q/4/

Вы не можете удалять из массива счетные вперед, так как элементы после удаляемого элемента будет «двигаться» в слот вы просто удалено из. Таким образом, вместо удаления от начала до конца мы удаляем от конца до начала и обходим эту проблему с индексом.

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