2016-04-29 13 views
-1

オブジェクト内のアイテムをループし、値がtrueのdeleteプロパティでアイテムを削除しようとして、そのオブジェクトをデータとして投稿しようとしています。javascript配列からアイテムを削除するとエラーが発生する

スプライスを使用してアイテムを削除すると、Uncaught TypeErrorが発生します。未定義のエラーの 'delete'プロパティを読み取れません。何故ですか?

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

[関連する、おそらくdupe?](http://stackoverflow.com/questions/500606/javascript-array-delete-elements)配列内の項目を削除しようとしているが、オブジェクトからプロパティを削除しない。 –

+1

'delete()'はそれを配列に渡して、それを扱いにくく、難しくします。このタイプの行動が必要な理由は、部分的なデータがあり、テーブルの空き領域を埋める必要がある場合です。 'pop'または' shift'を使用してください://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/

削除要素の後の要素がスロットに「の移動」しますので、あなたは、転送カウント配列から削除することはできません、あなただけから削除されます。したがって、最初から最後まで削除するのではなく、最初から最後まで削除し、このインデックスの問題を回避します。

関連する問題