मैं array.splice के इस अजीब दुष्प्रभाव में भाग गया, और कोड को फिर से बनाने के लिए आवश्यक न्यूनतम तक आसवित कर दिया। हां, इनमें से अधिकतर सरणी के साथ एक लाइन पर किया जा सकता है। लेकिन मुझे दिलचस्पी है कि मैंने गलती की है या कुछ और चल रहा है या नहीं।array.splice शेष तत्वों से मूल्यों को हटाने
var array = [];
for (var i = 0; i < 10; i++) {
array.push({
value: i
});
}
array.forEach(function(item, index, intArray) {
if (item.value % 2 == 1) {
item.odd = true;
} else {
item.odd = false;
}
if (item.odd) {
console.log("Removing " + item.value);
intArray.splice(index, 1);
}
});
console.log(array);
अजीब तत्वों में यह जावास्क्रिप्ट परिणाम चल रहा है के रूप में उम्मीद हटाया जा रहा है, लेकिन यह भी intArray निकाला जा रहा है 2 आइटम, 4, 6, और 8 के लिए item.odd मान निकाल दिए। स्प्लिस लाइन अजीब सरणी तत्वों को वापस लाती है, लेकिन यह सभी तत्वों के लिए item.odd मान भी वापस लाती है।
मैंने इसे एफएफ और क्रोम में परीक्षण किया है। यह व्यवहार तब भी बनी रहती है जब कॉलबैक में केवल वस्तु को पास किया जाता है, इंडेक्स के साथ array.indexOf के माध्यम से गणना की जाती है, और लूप के बाहर से सरणी को संदर्भित किया जाता है।
मुझे आश्चर्य है कि सरणी के साथ कुछ समस्या है जब आप इसे लूप कर रहे हैं। शायद 'इंडेक्स' मान मूल सरणी में सूचकांक है और नए संशोधित में नहीं है। –
मेरे समान विचार थे। हालांकि, मुझे उम्मीद है कि उस मामले में बग आइटम और इंडेक्स अपेक्षित रूप से मेल नहीं खाएगा, इसलिए तत्वों के भीतर मूल्यों के बजाय बहुत सारे या बहुत कम तत्व हटा दिए जा रहे हैं। प्लस, अगर ऐसा होता तो मैं कॉलबैक में गुजरने वाले इंडेक्स के बीच एक अंतर के लिए देखता हूं और इसे फ्लाईट पर गणना करता हूं - लेकिन वे अभ्यास में भी काम करते हैं। –