2013-07-09 10 views
7

मैं परीक्षण कर रहा था कि splice एक सरणी के माध्यम से फिर से काम करते समय काम करता है, और समझ में नहीं आता कि 0 सूची में क्यों रहे?सूची से 0 को क्यों हटाया नहीं गया है?

var array = [2, 5, 9, 14, 0, 1, 3, 6, 7]; 
for (var i = 0; i < array.length; i++) { 
    if (array[i]%2 == 0) { 
     array.splice(i,1); 
    } 
} 

//0 % 2 == 0 is true, and yet 
//array = [5, 9, 0, 1, 3, 7] 
+6

आप सभी मूल्यों पुनरावृत्ति नहीं कर रहे हैं, तो आप पीछे की ओर क्योंकि सरणी हर जोड़ पर reindexed है पाश करने के लिए है। – bfavaretto

+1

एक ऐसा महसूस कर रहा था जो हो सकता है, लेकिन टेस्ट केस को पर्याप्त रूप से सेट नहीं किया है ... लेकिन पीछे की तरफ +1 करने के बारे में अच्छी युक्ति! – user1766760

+0

अजीब पूर्णांक चाहते हैं? [2, 5, 9, 14, 0, 1, 3, 6, 7]। फ़िल्टर (/ ./। परीक्षण,/[13579] $ /) – dandavis

उत्तर

10

0 को छोड़ दिया जा रहा है

आप (परिवर्तनशील) परिवर्तनशील रहे सरणी जब आप इसे माध्यम से पुनरावृत्ति कर रहे हैं। यह एक प्रोग्रामिंग नो-गो है।

के माध्यम से चलना करते हैं ...

मैं = 0 और 2 भी है और spliced ​​हो जाता है, अपने सरणी अब [5, 9, 14, 0, 1, 3, 6, 7]

है i = 1 और हमने 5 की जांच भी नहीं की जो अब इंडेक्स 0 में है ... हम अब 9 की जांच कर रहे हैं जो अजीब है, ठीक

i = 2 और 14 यहां तक ​​कि स्प्लिस्ड हो गया है, आपकी सरणी अब है [5, 9, 0, 1, 3, 6, 7]

i = 3 और 0 छोड़ दिया जाता है (जैसा कि 0 अब सूचकांक 2 में है), 1 अजीब है, ठीक

मैं = 4 है अजीब ठीक

मैं = 5 है भी और

spliced ​​हो i = 6 अजीब ठीक

क्या आप वास्तव में चाहते हैं इस ...

Array.prototype.filter = function(func) { 
    var result = new Array(); 
    for (var i = 0; i < this.length; ++i) 
    if (func(this[i])) 
     result.push(this[i]); 
    return result; 
} 

values = [2, 5, 9, 14, 0, 1, 3, 6, 7]; 
odd_only = values.filter(function(x) { x % 2 != 0; }); 
+0

हां, अगर मैं एक सेटअप करता तो यह बहुत स्पष्ट रूप से स्पष्ट होता रोल में कुछ और संख्याएं भी। हालांकि, bfavaretto के जवाब से, ऐसा लगता है कि अगर मैं पीछे की तरफ घुमाता हूं तो मुझे मिल सकता है ... कोई नुकसान नहीं हुआ? (0) – user1766760

+0

आप इस उदाहरण में पीछे की ओर फिर से चल सकते हैं, लेकिन फिर से चलते समय एक सरणी को बदलना एक महान प्रोग्रामिंग अभ्यास नहीं है –

+0

' (! (Array.prototype में फ़िल्टर करें)) – bfavaretto

6
है

प्रत्येक बार जब आप सरणी से कोई मान हटाते हैं, तो आप इसे अनुसरण करने वाले व्यक्ति को छोड़ देते हैं, क्योंकि सरणी प्रत्येक स्प्लिसे पर पुन: संशोधित होती है। आप इसके बजाय पीछे की ओर लूप कर सकते हैं:

var array = [2, 5, 9, 14, 0, 1, 3, 6, 7]; 
for (var i = array.length-1; i >= 0; i--) { 
    if (array[i]%2 == 0) { 
     array.splice(i,1); 
    } 
} 
+0

इसके माध्यम से पुनरावृत्ति करते समय एक सरणी को उत्परिवर्तित करना बहुत अच्छा प्रोग्रामिंग अभ्यास नहीं है –

+0

यह आपकी राय है। यह निश्चित रूप से सुरक्षित रूप से किया जा सकता है। – bfavaretto

2

यह 0 को छोड़ देता है क्योंकि splice सरणी को फिर से अनुक्रमित करता है। इस प्रयोग:

var array = [2, 5, 9, 14, 0, 1, 3, 6, 7]; 
for (var i = 0; i < array.length; i++) { 
    if (array[i]%2 == 0) { 
     array.splice(i,1); 
     i = i - 1; 
    } 
} 
+0

क्या यह पूरे सरणी को फिर से चालू करेगा? – Notepad

+1

हां इसे पूरे सरणी को पुन: सक्रिय करना चाहिए –

+0

यह पूरे सरणी के माध्यम से फिर से शुरू हो जाएगा और यह भी 1 और अंतिम तत्व का ख्याल रखेगा। – Gyandeep

संबंधित मुद्दे