जावास्क्रिप्ट सरणी खोज और स्ट्रिंग निकालें?


134

मेरे पास है:

var array = new Array();
array.push("A");
array.push("B");
array.push("C");

मैं ऐसा कुछ करने में सक्षम होना चाहता हूं:

array.remove("B");

लेकिन कोई निष्कासन समारोह नहीं है। मैं इसे कैसे पूर्ण करूं?


5
का संयोजन .indexOf()और .splice()चाल चलनी चाहिए। या हो सकता है, वैकल्पिक रूप से, .filter()
मार्क बी

1
यहाँ देखें: stackoverflow.com/questions/3954438/…
benedict_w

जवाबों:


186

मैं वास्तव में इस थ्रेड को 1-लाइन समाधान के साथ अपडेट कर रहा हूं:

let arr = ['A', 'B', 'C'];
arr = arr.filter(e => e !== 'B'); // will return ['A', 'C']

मूल रूप से सरणी को फ़िल्टर करने के लिए मूल रूप से सभी तत्वों को अलग करना है जिसे आप निकालना चाहते हैं।

नोट: सभी घटनाओं को दूर करेगा।

संपादित करें:

यदि आप केवल पहली घटना को हटाना चाहते हैं:

t = ['A', 'B', 'C', 'B'];
t.splice(t.indexOf('B'), 1); // will return ['B'] and t is now equal to ['A', 'C', 'B']

1
यह समाधान सरणी की एक प्रति लौटाता है, जबकि बंटवारे का उपयोग करने से जगह में तत्व (ओं) को हटा दिया जाता है। जो आप चुनते हैं वह संदर्भ पर निर्भर करता है।
टि्वटहेड

6
यह Redux सामान के लिए एकदम सही है जहां आपको एक नया राज्य वापस करने की आवश्यकता है।
कॉलिनवॉन्ग

@Regis वास्तव में नहीं है, arr.filter एक नया सरणी देता है। तो arr.filter (e => e! == 'B') गिरफ्तारी को संशोधित नहीं करेगा। या शायद मैं आपकी टिप्पणी को ठीक से समझ नहीं पाया?
टायरनस

क्या ऐसा करने की कोई विधि है लेकिन पहली घटना को रोकने के लिए? तो अगर theres 5 'B का सिर्फ एक हटाने के लिए?
अरी

1
@ श्री मैंने केवल एक तत्व को हटाने के लिए उत्तर अपडेट किया है
Tyrannas

171

सूची को रिवर्स ऑर्डर में लूप करें, और .spliceविधि का उपयोग करें ।

var array = ['A', 'B', 'C']; // Test
var search_term = 'B';

for (var i=array.length-1; i>=0; i--) {
    if (array[i] === search_term) {
        array.splice(i, 1);
        // break;       //<-- Uncomment  if only the first term has to be removed
    }
}

रिवर्स ऑर्डर महत्वपूर्ण है जब खोज शब्द की सभी घटनाओं को हटाया जाना है। अन्यथा, काउंटर बढ़ जाएगा, और आप तत्वों को छोड़ देंगे।

जब केवल पहली घटना को हटाया जाना है, तो निम्नलिखित भी काम करेगा:

var index = array.indexOf(search_term);    // <-- Not supported in <IE9
if (index !== -1) {
    array.splice(index, 1);
}

1
मैं अनुमान लगा रहा हूं क्योंकि इसका मतलब है कि रिवर्स में पुनरावृति करने के लिए थोड़ा तेज होना।
बेन क्लेटन

1
@BenClayton: धन्यवाद। FWIW, जावास्क्रिप्ट में, यह मज़बूती से सच नहीं है। 0यह कहते हुए कि यह आपके पास है, सी। के रूप में लंबे समय तक स्वचालित रूप से तेजी से नहीं गिना जाता है, जब तक आप सीमा को कैश नहीं करते हैं, तो निश्चित रूप से, जो आपको पहले मैच के बाद भी चलते रहेंगे (लेकिन अगर आप इसे रोकते हैं तो नहीं)।
टीजे क्राउडर

अगर हम गति के लिए जा रहे हैं तो उपयोग क्यों नहीं करते -? : डी
स्नफ़लूपगस

11
यह गति के बारे में नहीं है, वह अपने जवाब में भी ऐसा कहता है। यह SKIPPING तत्वों के बारे में है। यदि आप स्थिति 5 पर हैं और आप उस स्थिति को विभाजित करते हैं, तो स्थिति 6 पर स्थित तत्व फॉर्मेलरी अब 5 पर है । फिर भी, आपका लूप-काउंटर बढ़ता है, अगला पुनरावृत्ति स्थिति 6 है और यहीं पर आपने एक आइटम छोड़ दिया है। इसलिए यह उल्टे क्रम में है।
22

1
यदि आप किसी अग्रेषित लूप में आइटम निकालते हैं, और एक आइटम हटा दिया जाता है, तो अंतिम पुनरावृत्ति अशक्त सूचक अपवादों को फेंक सकती है क्योंकि यह एक सूचकांक का संदर्भ देगा जो मौजूद नहीं है
19

24

वन लाइनर्स की सूची

आइए इस समस्या को इस सरणी के लिए हल करें:

var array = ['A', 'B', 'C'];

1. केवल पहला निकालें: उपयोग करें यदि आप सुनिश्चित हैं कि आइटम मौजूद है

array.splice(array.indexOf('B'), 1);

2. केवल अंतिम निकालें: उपयोग करें यदि आप सुनिश्चित हैं कि आइटम मौजूद है

array.splice(array.lastIndexOf('B'), 1);

3. सभी घटनाएँ निकालें:

array = array.filter(v => v !== 'B'); 

21

डेमो

आपको उस स्थान का पता लगाने की आवश्यकता है जिसे आप खोज रहे हैं और .indexOf()फिर उसे हटा दें.splice()

function remove(arr, what) {
    var found = arr.indexOf(what);

    while (found !== -1) {
        arr.splice(found, 1);
        found = arr.indexOf(what);
    }
}

var array = new Array();
array.push("A");
array.push("B");
array.push("C");
    
remove(array, 'B');
alert(array)​​​​;

यह सभी घटनाओं का ध्यान रखेगा।


ब्राउज़रों कि समर्थन नहीं करते के लिए .indexOf()आप जोड़ सकते हैं इस अपने जावास्क्रिप्ट फाइल करने के लिए।
qwertymk

हाँ, सुरुचिपूर्ण। यदि आपको केवल कुछ तत्वों को निकालने के लिए एक विकल्प की आवश्यकता है, उदाहरण के लिए केवल पहला: वही अपडेट किया गया: jsfiddle.net/qpZFd/9
sebilasse

मुझे हमेशा निम्न त्रुटि मिलती है Uncaught ReferenceError: array is not defined:। गलत क्या है?
पाथ्र्स

यदि आप इस मार्ग पर जा रहे हैं, तो आप आसानी से .indexOf()बस थोड़ा अधिक का लाभ उठा सकते हैं । यदि आप लूप के भीतर कॉल foundकरने के लिए दूसरे तर्क के रूप में पास करते हैं , तो पहले से ही चेक किए गए और समाप्त नहीं होने वाले एरे में तत्वों को फिर से चेक नहीं किया गया है: .indexOf()found = arr.indexOf(what, found);
pimhogeling

14

केवल

array.splice(array.indexOf(item), 1);

हाँ, सिवाय इसके कि indexOf वापस आ जाएगा -1अगर कुछ भी नहीं मिला है और नहीं है, तो ब्याह सरणी के अंत से 1 तत्व को हटा देगा
रिकी स्पेनिश

2

सरल समाधान (ES6)

यदि आपके पास डुप्लिकेट तत्व नहीं है

Array.prototype.remove = function(elem) {
  var indexElement = this.findIndex(el => el === elem);
  if (indexElement != -1)
    this.splice(indexElement, 1);
  return this;
};   

ऑनलाइन डेमो (फिडल)


यह समाधान हमेशा अंतिम तत्व को निकालता है यदि कोई मेल नहीं मिलता है।
मार्कस

1

आपको खुद को हटाने के लिए लिखना होगा। आप सरणी पर लूप कर सकते हैं, उस आइटम के सूचकांक को पकड़ सकते हैं जिसे आप निकालना चाहते हैं, और spliceइसे हटाने के लिए उपयोग करें।

वैकल्पिक रूप से, आप एक नई सरणी बना सकते हैं, वर्तमान सरणी पर लूप कर सकते हैं, और यदि वर्तमान ऑब्जेक्ट मेल नहीं खाता है जिसे आप निकालना चाहते हैं, तो इसे एक नए सरणी में डालें।


1

उपयोग:

array.splice(2, 1);

यह अनुक्रम 2 (3 आइटम) पर शुरू होने वाले सरणी से एक आइटम को निकालता है


1
वास्तव में यह सरणी से दूसरा आइटम हटा देगा, सूचकांक शून्य से शुरू होता है। इस कथन में अस्पष्टता है, और अधिक सरल उदाहरण हो सकता है array.splice(2,1)जो कि सरणी 2 से 1 आइटम को सरणी से निकालता है। अधिक जानकारी के लिए https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice चेक करें
imdzeeshan

1
const changedArray = array.filter( function(value) {
  return value !== 'B'
});

या आप उपयोग कर सकते हैं:

const changedArray = array.filter( (value) => value === 'B');

ChangeArray में बिना मान 'B' होगा


0

array.splice का उपयोग करें

/*array.splice(index , howMany[, element1[, ...[, elementN]]])

array.splice(index) // SpiderMonkey/Firefox extension*/

array.splice(1,1)

स्रोत: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice


के बीच अल्पविराम arrayऔर spliceएक बिंदु होना चाहिए।
रोब डब्ल्यू

सही करने की कोशिश की गई लेकिन एसओ की नीति में कहा गया है कि संपादन 6 वर्ण या अधिक होना चाहिए: /
ben_nuttall
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.