मैं एक सूची में से एक तत्व को कैसे हटा सकता हूँ, लताड़ के साथ?


166

मेरे पास एक वस्तु है जो इस तरह दिखती है:

var obj = {
    "objectiveDetailId": 285,
    "objectiveId": 29,
    "number": 1,
    "text": "x",
    "subTopics": [{
        "subTopicId": 1,
        "number": 1
    }, {
        "subTopicId": 2,
        "number": 32
    }, {
        "subTopicId": 3,
        "number": 22
    }]
}
var stToDelete = 2;

मैंने lodashअपने आवेदन में अन्य चीजों के लिए स्थापित किया है। वहाँ का उपयोग करने के एक प्रभावशाली तरीका है lodash: प्रविष्टि को हटाने के लिए {"subTopicId":2, "number":32}से objवस्तु?

या ऐसा करने के लिए एक जावास्क्रिप्ट तरीका है?


1
आप किसी सूची से आइटम हटाने के लिए बस splice( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ) का उपयोग कर सकते हैं
11:33 पर z33m

1
शीर्षक बदला क्योंकि एक सरणी से 4 को हटाना [1,4,5] इस तरह से नहीं किया जा सकता है। हां, मैं समझता हूं कि सरणियों को हैश / ऑब्जेक्ट से लागू किया जा सकता है और शायद है, लेकिन इन दोनों में एक सूक्ष्म अंतर है। एक सरणी से निकालने के लिए आप result = _.pull(arr, value) इसका उपयोग करेंगे यह सूची से सभी मिलान मूल्यों को हटा देगा।
बोटकोडर

जवाबों:


248

जैसा कि गीतकारों ने टिप्पणियों में बताया है, ऐसा करने के लिए अधिक मुहावरेदार और आकर्षक तरीके का उपयोग करना होगा _.remove, जैसे कि यह

_.remove(obj.subTopics, {
    subTopicId: stToDelete
});

इसके अलावा, आप एक विधेय फ़ंक्शन पास कर सकते हैं जिसका परिणाम यह निर्धारित करने के लिए उपयोग किया जाएगा कि वर्तमान तत्व को हटाया जाना है या नहीं।

_.remove(obj.subTopics, function(currentObject) {
    return currentObject.subTopicId === stToDelete;
});

वैकल्पिक रूप से, आप पुराने को फ़िल्टर करके एक नई सारणी बना सकते हैं _.filterऔर इसे उसी वस्तु पर असाइन कर सकते हैं, जैसे

obj.subTopics = _.filter(obj.subTopics, function(currentObject) {
    return currentObject.subTopicId !== stToDelete;
});

या

obj.subTopics = _.filter(obj.subTopics, {subTopicId: stToKeep});

3
कारण यह है कि यह उत्तर चट्टानें हैं क्योंकि आप एक विधेय फ़ंक्शन का उपयोग कर सकते हैं , जो कि वास्तव में मैं देख रहा था। यदि आप इंडेक्स को जानते हैं तो एक तत्व निकालना तुच्छ है, लेकिन जब आप इंडेक्स को नहीं जानते हैं तो क्या होगा ?
random_user_name

3
यदि आप मूल सारणी को बदलना नहीं चाहते हैं, तो _.filter उल्लेख करने योग्य हो सकता है ....
random_user_name

@cale_b धन्यवाद :-) _.filterसंस्करण के साथ उत्तर अपडेट किया गया ।
thefourtheye

7
@thefourtheye _.filter एक तत्व लौटाते हैं यदि विधेय सत्य है। आपका क्रियान्वयन उन सभी अवांछित तत्वों को वापस कर देगा जिनके बजाय आप रखना चाहते हैं
एक्सल्टर

5
@thefourtheye आपको एक ही विधेय _.rejectका उपयोग करने के बजाय उपयोग करना चाहिए _.filter। अधिक विवरण के लिए मेरे उत्तर की जाँच करें !
एक्सल्टर

29

बस वेनिला जेएस का उपयोग करें। आप spliceतत्व को निकालने के लिए उपयोग कर सकते हैं :

obj.subTopics.splice(1, 1);

डेमो


3
उपयोगकर्ता पूछता हैIs there an efficient way to use _lodash to delete
सेमरगुरे

7
@ और आप सही हैं, लेकिन क्या होगा यदि सूचकांक पहले से ही ज्ञात नहीं है?
Thefourtheye

3
यदि आप चाहते हैं कि आपका सरणी उत्परिवर्तित हो तो ब्याह () सबसे अच्छा तरीका है। यदि आप निष्कासन का उपयोग करते हैं तो यह नया एरे लौटाता है और इसे फिर से असाइन करना होता है।
ओमर्जेबरी

यदि आप किसी आइटम को उसके अनुक्रमणिका से सरणी में हटाना चाहते हैं (जाहिर है, आपके पास यह सूचकांक है यदि आप इस तरह से हटाने की क्रिया करना चाहते हैं), तो ब्याह विधि का उपयोग करना सबसे कुशल (और आसान) तरीका है इसे करने के लिए। किसी भी चीज़ की तुलना करने और बग और त्रुटियों के लिए कोड को अधिक जटिल और असुरक्षित बनाने की कोई आवश्यकता नहीं ...
TheCuBeMan

26

आप इसके साथ कर सकते हैं _pull

_.pull(obj["subTopics"] , {"subTopicId":2, "number":32});

जाँच संदर्भ


7
डॉक्स के अनुसार, तुलना के लिए सख्त समानता_.pull का उपयोग करता है , अर्थात === । दो अलग-अलग सादे वस्तुओं की तुलना कभी भी ===(या ==उस मामले के लिए) के बराबर नहीं होगी । इस प्रकार ऊपर दिया गया आपका कोड सरणी से किसी भी तत्व को कभी नहीं हटाएगा।
मार्क अमेरी

1
फिर भी, यह केवल एक है जो सरणी में तार के साथ काम करता है। _.removeबस सरणी flushes।
योहानी प्रकोपचेक

3
मुझे अभी भी लगता है कि यह सही उत्तर है। JS .filter मेल खाने वाले सभी तत्वों को हटा देता है, JS .splice के लिए आवश्यक है कि मैं सूचकांक को जानता हूं, _.remove सरणी के सभी तत्वों पर पुनरावृत्त करता है और इस प्रकार कम कुशल होता है। _.pull बिल्कुल वही है जो मैं चाहता हूं: _.pull (सरणी, itemToRemove)।
जुडाह गेब्रियल हिमंगो

21

अब आप _.reject का उपयोग कर सकते हैं जो आपको उस चीज़ के आधार पर फ़िल्टर करने की अनुमति देता है जो आपको निकालने की आवश्यकता है, बजाय इसके कि आपको क्या रखने की आवश्यकता है।

इसके विपरीत _.pullया _.removeजो केवल सरणियों पर काम करता है, ._rejectकिसी पर काम कर रहा है Collection

obj.subTopics = _.reject(obj.subTopics, (o) => {
  return o.number >= 32;
});

2

ऐसा करने के चार तरीके हैं जैसा कि मुझे पता है

const array = [{id:1,name:'Jim'},{id:2,name:'Parker'}];
const toDelete = 1;

सबसे पहला:

_.reject(array, {id:toDelete})

दूसरा है:

_.remove(array, {id:toDelete})

इस तरह से सरणी म्यूट हो जाएगी।

तीसरा है:

_.differenceBy(array,[{id:toDelete}],'id')
// If you can get remove item 
// _.differenceWith(array,[removeItem])

पिछले एक है:

_.filter(array,({id})=>id!==toDelete)

मैं सीख रहा हूँ lodash

एक रिकॉर्ड बनाने के लिए उत्तर दें, ताकि मैं इसे बाद में पा सकूं।


मैं खोज रहा थाreject
Sampgun

2

पारंपरिक अनाम कार्यों के बजाय विधेय का उपयोग करते हुए @thefourtheye जवाब में :

  _.remove(obj.subTopics, (currentObject) => {
        return currentObject.subTopicId === stToDelete;
    });

या

obj.subTopics = _.filter(obj.subTopics, (currentObject) => {
    return currentObject.subTopicId !== stToDelete;
});


0

यहाँ सरणी के साथ सरल लॉश फ़ंक्शन है और इसे इंडेक्स नंबर के साथ हटा रहा है।

index_tobe_delete = 1

fruit = [{a: "apple"}, {b: "banana"}, {c: "choco"}]
_.filter(fruit, (value, key)=> {
return (key !== index_tobe_delete)
})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.