2017-01-18 3 views
5

क्या यह किसी चीज़ की पहली घटना को प्रतिस्थापित करने का सबसे अच्छा तरीका है?एक सरणी में किसी आइटम की पहली घटना को प्रतिस्थापित करने का सबसे अच्छा तरीका

my_list[my_list.indexOf(old_item)] = new_item 

नोट: यदि आइटम सरणी में नहीं है, तो मैं कुछ भी नहीं करना चाहता हूं। (कोई त्रुटि नहीं/टूट सरणी)

+1

उतना अच्छा लगता है जितना आप मुझे प्राप्त कर सकते हैं। लेकिन आपको जांचना चाहिए कि 'indexOf() 'पहले सफल होता है या नहीं। – Barmar

+0

यह सही है। सरणी पर नकारात्मक इंडेक्स छिपे हुए हैं, यानी वे छिपे हुए जेएस डेटा/मान हैं, वे पुनरावृत्त नहीं होते हैं, वे JSON स्ट्रिंग द्वारा प्रकट नहीं होते हैं, न ही स्ट्रिंग रूपांतरणों के लिए सरणी पर, या स्रोत के लिए सरणी आदि। और वे सरणी के लंबाई मान को नहीं बदलते हैं - ऐसा लगता है कि वे बिल्कुल नहीं हैं। लेकिन वे मौजूद हैं! उदाहरण: [सरणी] [- 1]> इसे सौंपा गया नवीनतम डेटा वापस कर देगा। तो आपकी विधि व्यावहारिक रूप से सुरक्षित है और सबसे तेज़ उपलब्ध है। –

उत्तर

2

आप सुनिश्चित नहीं मद सूची में है आपको क्या करना चाहिए रहे हैं:

var idx = my_list.indexOf(old_item) 
if (idx !== -1) { my_list[idx] = new_item } 

लेकिन किसी और मुझे लगता है कि यह करने के लिए सबसे अच्छा तरीका है।

सूचकांक पर एक मूल्य सेट -1 एक त्रुटि से आगे नहीं बढ़ेगी, लेकिन अभी भी वस्तु एक सामान्य js वस्तु में एक महत्वपूर्ण स्थापित करने के रूप में संशोधित करेगा:

var my_list = [1, 2, 3]; 
var old_item = 5; 
var new_item = 10; 
my_list[my_list.indexOf(old_item)] = new_item; 
// my_list is [1, 2, 3, '-1': 10] 
// my_list.length is still 3 
// Object.keys(my_list) is [ '0', '1', '2', '-1' ] 

तो आप शायद नहीं चाहिए इसे करने के लिए।

+1

क्या वह विशेष रूप से नहीं कहता था कि वह केवल सूची में पहली * घटना को प्रतिस्थापित करना चाहता था? – furkle

+1

@ChiefTwoPencils धन्यवाद, वह एक टाइपो था! पहली मिलान सूचकांक का मतलब है। – furkle

+0

yup :) मैंने संपादित किया। – Guig

0

वास्तव में नहीं! ऐसे कुछ तरीके हैं जो आप कर सकते हैं - एक तरीका आपके पास है, दूसरा विधि indexOf के बजाय विधि का उपयोग कर रहा है, जो अधिक बहुमुखी है कि यह रेगेक्स तर्क स्वीकार कर सकता है। ध्यान दें कि search कुछ पुराने जेएस वातावरण में समर्थित नहीं है। filter, या splice का उपयोग करने जैसे लंबे, बदतर तरीके भी हैं, लेकिन वे निश्चित रूप से बेहतर काम नहीं करेंगे।

केवल सुझाव मैं चाहता हूँ एक सशर्त कि जांच करता है कि old_item सूची में अब भी है है - indexOf रिटर्न -1 अगर कुछ सूची में नहीं है, और उस मामले में, आप एक न के बराबर की जगह हो जाएगा सूचकांक।

असल में, मुझे लगता है कि आप ठीक हैं - यह सबसे सुंदर अभिव्यक्ति नहीं हो सकता है, लेकिन यह जेएस में प्राप्त होने के रूप में संक्षेप में है।

0

Arrays मूल्यों को खोजने के लिए उपयोगी संरचनाएं नहीं हैं। आप विचार कर सकते हैं एक के बजाय सेट:

my_set.delete(old_item); 
my_set.add(new_item); 

ध्यान रखें कि आपके कोड अपेक्षा के अनुरूप व्यवहार नहीं कर सकते यदि old_item सरणी में प्रकट नहीं होता है, तो indexOf-1 वापस आ जाएगी। हो सकता है कि कुछ इस तरह का उपयोग करें:

var idx = my_list.indexOf(old_item); 
if (idx >= 0) my_list[idx] = new_item; 
else my_list.push(new_item); 
0

indexOf निश्चित रूप से बेहतरीन तरीके से एक है। लेकिन क्या आप वाकई indexOf सफल रहा था बनाने के लिए उपयोग करने से पहले चाहते हैं:

var index = my_list.indexOf(old_item); 

if (index !== -1) { 
    my_list[index] = new_item; 
} 

इसके अलावा, आप ~ ऑपरेटर का उपयोग कर सकते हैं अगर आप संक्षिप्त जावास्क्रिप्ट में कर रहे हैं:

var index = my_list.indexOf(old_item); 

if (~index) { 
    my_list[index] = new_item; 
} 
0

फास्ट समाधान Array.prototype.indexOf और Array.prototype.splice फ़ंक्शन का उपयोग करके

var myList = [1,2,3,4,5], oldItem = 4, newItem = 7; 
 
~(pos = myList.indexOf(oldItem)) && myList.splice(pos, 1, newItem); 
 

 
console.log(myList);

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

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