UnderscoreJS का उपयोग करके सरणी से एक आइटम निकालें


137

कहो कि मेरे पास यह कोड है

var arrest = [{id: 1, name: 'a'}, {id: 2, name: 'b'}, {id: 3, name: 'c'}];

और मैं सरणी से id = 3 के साथ आइटम निकालना चाहता हूं। क्या बिना मसाले के ऐसा करने का कोई तरीका है? अंडरस्कोर का उपयोग करके कुछ कर सकते हैं या ऐसा कुछ?

धन्यवाद!


यदि आप एक नया ऐरे बनाना नहीं चाहते हैं, तो स्पाइसलिंग एकमात्र विकल्प है। मैं शर्त लगाता हूं कि अंडरस्कोर भी इसका उपयोग करता है (आंतरिक रूप से, यदि ऐसी कोई विधि मौजूद है)।
फेलिक्स क्लिंग

6
स्पाइसिंग में क्या गलत है?
11इम विद

क्या आपने अंडरस्कोर के संदर्भ की जाँच की है?
12मी विद्या

सादे जावास्क्रिप्ट का उपयोग करके, यह ऑब्जेक्ट प्रॉपर्टी द्वारा सरणी से ऑब्जेक्ट को हटाने का एक डुप्लिकेट है ।
फेलिक्स क्लिंग

5
अच्छी तरह से डुप्लिकेट नहीं है क्योंकि इसमें अंडरस्कोर के लिए टैग है। जेएस
गारिस एम सुरो

जवाबों:


279

सादे जावास्क्रिप्ट का उपयोग करते हुए, यह पहले से ही उत्तर दिया गया है: ऑब्जेक्ट संपत्ति द्वारा सरणी से ऑब्जेक्ट निकालें

अंडरस्कोर का उपयोग करना। js, आप के .findWhereसाथ संयोजन कर सकते हैं .without:

var arr = [{
  id: 1,
  name: 'a'
}, {
  id: 2,
  name: 'b'
}, {
  id: 3,
  name: 'c'
}];

//substract third
arr = _.without(arr, _.findWhere(arr, {
  id: 3
}));
console.log(arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

हालाँकि, चूंकि आप इस मामले में किसी भी तरह से एक नई सरणी बना रहे हैं, आप बस _.filterया देशी Array.prototype.filterफ़ंक्शन का उपयोग कर सकते हैं (जैसे कि अन्य प्रश्न में दिखाया गया है)। तब आप यहाँ पर दो बार संभावित रूप से एक बार सरणी पर केवल पुनरावृति करेंगे।

यदि आप सरणी को जगह में संशोधित करना चाहते हैं , तो आपको उपयोग करना होगा .splice। यह अन्य प्रश्न में भी दिखाया गया है और अंडरस्कोर उसके लिए कोई उपयोगी कार्य प्रदान नहीं करता है।


1
हां यह पूरी तरह से काम करता है, मैं अंडरस्कोर प्रलेखन पर गया था, लेकिन यह बिल्कुल समझ में नहीं आया कि इसे बिना कैसे बाहर निकालना है। धन्यवाद!
पर्वतारोही

10
क्या _.reject या _.filter () यहां बहुत अधिक कुशल नहीं होगा? आप सूची के दो पुनरावृत्तियों को केवल एक आइटम को बाहर निकालने के लिए समाप्त करेंगे।
रिक स्ट्राल

1
यह एक डुप्लिकेट हो सकता है लेकिन यह बेहतर उत्तर है।
माइकल जे। कैलकिंस

2
@RickStrahl आप सही हैं। _.rejectयहां एक बेहतर चयन की तरह दिखता है।
तारिक

1
@lukaserat अंतिम तत्व पॉप करने के लिए, का उपयोग करें arr.pop()...
एमिल

96

आप अंडरस्कोर का उपयोग कर सकते हैं .filter

    var arr = [{
      id: 1,
      name: 'a'
    }, {
      id: 2,
      name: 'b'
    }, {
      id: 3,
      name: 'c'
    }];

    var filtered = _(arr).filter(function(item) {
         return item.id !== 3
    });

के रूप में भी लिखा जा सकता है:

var filtered = arr.filter(function(item) {
    return item.id !== 3
});

var filtered = _.filter(arr, function(item) {
    return item.id !== 3
});

फिडल चेक करें

आप भी उपयोग कर सकते हैं .reject


मुझे लगता है कि आपका मतलब है: var फ़िल्टर्ड = _.filter (गिरफ्तारी, फ़ंक्शन (आइटम) {return item.id! == 3});
tbh__

2
@tbh__ _()संग्रह के चारों ओर एक आवरण बनाएगा जो आपको अंडरस्कोर विधियों को लागू करने देगा।
सुशांत -

वर्षों से अंडरस्कोर का उपयोग कर रहा हूं, मुझे यह कभी नहीं पता था। धन्यवाद
tbh__

39

अंडरस्कोर का उपयोग करें _.reject():

arr = _.reject(arr, function(d){ return d.id === 3; });

es6 के साथ आप कर सकते हैंarr = _.reject(arr, d => d.id === 3 );
greenafrican

16

किसी आइटम को किसी सरणी से निकालने के लिए अंडरस्कोर (_without) विधि एकदम सही है, खासकर यदि आपके पास हटाने की वस्तु है।

हटाए गए मानों के सभी उदाहरणों के साथ सरणी की एक प्रति लौटाता है।

_.without(["bob", "sam", "fred"], "sam");

=> ["bob", "fred"]

अधिक जटिल वस्तुओं के साथ भी काम करता है।

var bob = { Name: "Bob", Age: 35 };
var sam = { Name: "Sam", Age: 19 };
var fred = { Name: "Fred", Age: 50 };

var people = [bob, sam, fred]

_.without(people, sam);

=> [{ Name: "Bob", Age: 35 }, { Name: "Fred", Age: 50 }];

यदि आपके पास निकालने के लिए कोई वस्तु नहीं है, तो इसका एक गुण, आप उपयोग कर सकते हैं _.findWhereऔर फिर _.without


2
ध्यान दें: यह केवल इसलिए काम करता है क्योंकि आप बिना किसी ऑब्जेक्ट को पास कर रहे हैं। यदि आप इसके बजाय { Name: "Sam", Age: 19 }चर सैम के बजाय, बिना पास करते हैं, तो यह अब काम नहीं करता है। फिडल
एडम

5

यदि आप स्ट्रिंग्स को फ़िल्टर कर रहे हैं और केस असंवेदनशील फ़िल्टर ढूंढ रहे हैं तो कृपया व्यायाम की देखभाल करें। _.without () केस संवेदी है। आप नीचे दिखाए गए अनुसार _.reject () का भी उपयोग कर सकते हैं।

var arr = ["test","test1","test2"];

var filtered = _.filter(arr, function(arrItem) {
    return arrItem.toLowerCase() !== "TEST".toLowerCase();
});
console.log(filtered);
// ["test1", "test2"]

var filtered1 = _.without(arr,"TEST");
console.log(filtered1);
// ["test", "test1", "test2"]

var filtered2 = _.reject(arr, function(arrItem){ 
    return arrItem.toLowerCase() === "TEST".toLowerCase();
});
console.log(filtered2);
// ["test1", "test2"]

4

अन्य उत्तर सरणी की एक नई प्रति बनाते हैं, यदि आप उस सरणी को संशोधित करना चाहते हैं, जिसका आप उपयोग कर सकते हैं:

arr.splice(_.findIndex(arr, { id: 3 }), 1);

लेकिन यह मानता है कि तत्व हमेशा सरणी के अंदर पाया जाएगा (क्योंकि अगर यह नहीं मिला तो यह अंतिम तत्व को हटा देगा)। सुरक्षित होने के लिए आप उपयोग कर सकते हैं:

var index = _.findIndex(arr, { id: 3 });
if (index > -1) {
    arr.splice(index, 1);
}

2

या एक और आसान तरीका:

_.omit(arr, _.findWhere(arr, {id: 3}));

मेरे 2 सेंट


1
omit काम करता है objectऔर एक रिटर्न देता है object। इसलिए Arraysजहां हम arrayएक तत्व को हटाने के बाद वापस पाने की उम्मीद कर सकते हैं, वहां काम करने के लिए अच्छा नहीं है ।
स्क्रेपकोड

1
तो, _.without पर आप देख रहे हैं: _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4]
नदीम

2

उपयोग का उपयोग कर सकते सादे जावास्क्रिप्ट के Array#filterइस तरह विधि:

var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

var filteredArr = arr.filter(obj => obj.id != 3);

console.log(filteredArr);

या, इस तरह का उपयोग करें Array#reduceऔर Array#concatतरीके:

var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

var reducedArr = arr.reduce((accumulator, currObj) => {
  return (currObj.id != 3) ? accumulator.concat(currObj) : accumulator;
}, []);

console.log(reducedArr);

ध्यान दें:

  • ये दोनों शुद्ध क्रियात्मक दृष्टिकोण हैं ( अर्थात वे मौजूदा सरणी को संशोधित नहीं करते हैं)।
  • नहीं, इन दृष्टिकोणों में बाहरी पुस्तकालय की आवश्यकता है (वेनिला जावास्क्रिप्ट पर्याप्त है)।

0

मैं इस तरीके को आजमाता था

_.filter(data, function(d) { return d.name != 'a' });

उपयोगकर्ताओं द्वारा प्रदान किए गए उपरोक्त समाधानों की तरह बेहतर तरीके भी हो सकते हैं


0

अंडरस्कोर का उपयोग करके। js

var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

var resultArr = _.reject(arr,{id:3});

console.log(resultArr);

परिणाम होगा :: [{id:1name:'a'},{id:2,name:'c'}]


-1

आप अंडरस्कोर के अस्वीकार पद्धति का उपयोग कर सकते हैं, नीचे एक नया सरणी लौटाएगा जिसमें विशेष मैच के साथ सरणी नहीं होगी

arr = _.reject(arr, function(objArr){ return objArr.id == 3; });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.