ऑब्जेक्ट प्रॉपर्टी के आधार पर ऐरे एलिमेंट निकालें


270

मेरे पास वस्तुओं की एक सरणी है जैसे:

var myArray = [
    {field: 'id', operator: 'eq', value: id}, 
    {field: 'cStatus', operator: 'eq', value: cStatus}, 
    {field: 'money', operator: 'eq', value: money}
];

मैं इसकी संपत्ति के आधार पर किसी विशिष्ट को कैसे निकालूं?

उदा। मैं फील्ड प्रॉपर्टी के रूप में 'मनी' के साथ ऐरे ऑब्जेक्ट को कैसे हटाऊंगा?

जवाबों:


382

एक संभावना:

myArray = myArray.filter(function( obj ) {
    return obj.field !== 'money';
});

कृपया ध्यान दें कि filterएक नया सरणी बनाता है। मूल सरणी का संदर्भ देने वाले किसी भी अन्य चर को फ़िल्टर किया गया डेटा नहीं मिलेगा, हालांकि आप myArrayनए संदर्भ के साथ अपने मूल चर को अपडेट करते हैं । सावधानी से प्रयोग करें।


6
ध्यान दें कि filter()केवल इंटरनेट एक्सप्लोरर 9+ के लिए उपलब्ध है
jessegavin

@jessegavin वास्तव में। मुझे यह उल्लेख करना चाहिए कि वहाँ बहुत सारे अच्छे es5 शिम लाइब्रेरी उपलब्ध हैं, जो कार्यक्षमता की नकल करते हैं (बस अगर आप विरासत ब्राउज़रों का समर्थन करना चाहते हैं)
jAndy

3
filter()एक नया सरणी बनाता है, जो ठीक है यदि आप चर को फिर से असाइन करने में सक्षम हैं और जानते हैं कि कोड के अन्य क्षेत्र नहीं हैं जिनके पास इसके संदर्भ हैं। यदि आपको विशेष रूप से मूल सरणी ऑब्जेक्ट को संशोधित करने की आवश्यकता है तो यह काम नहीं करेगा।
ब्रायन ग्लिक

2
क्या होगा अगर सरणी एक पेड़ की संरचना से पहले ardeDeleteOperationArray = [{"id": 3.1, "name": "test 3.1", "activityDetails": [{"id": 22, "name": "3.1"} का उपयोग करें। {"आईडी": २३, "नाम": "परिवर्तित परीक्षण २३"}]]] और मैं आईडी हटाना चाहता हूं: २३
भूल से

@forgottofly अच्छा बिंदु - जवाब केवल सीमित मामलों के लिए काम करता है। क्या आपको अपने प्रश्न का उत्तर मिला?
JackTheKnife

88

सरणी के माध्यम से अलग, और spliceआप नहीं चाहते हैं। आसान उपयोग के लिए, पीछे की ओर पुनरावृत्त करें ताकि आपको सरणी की लाइव प्रकृति को ध्यान में न रखना पड़े:

for (var i = myArray.length - 1; i >= 0; --i) {
    if (myArray[i].field == "money") {
        myArray.splice(i,1);
    }
}

3
आप सरणी की लाइव प्रकृति से क्या मतलब है? @ नीट द डार्क
एब्सॉल

29
@sisimh का अर्थ है कि यदि आप एक लम्बाई से अधिक का पुनरावृति करते हैं, तो पुनरावृति तर्क के भाग के रूप में इसकी लंबाई का उपयोग करके और इसकी लंबाई बदल जाती है क्योंकि इसमें ऐसे तत्व निकाले गए हैं या जोड़े गए हैं जो आप सरणी के अंत तक भागना समाप्त कर सकते हैं या ऑपरेशन नहीं कर सकते हैं। सरणी में प्रत्येक आइटम। पीछे की ओर जाने से यह बहुत कम होने की संभावना है क्योंकि यह एक चलती लंबाई के बजाय एक स्थिर 0 सूचकांक की ओर काम करता है।
क्लस्टर्स

2
क्या होगा अगर सरणी एक पेड़ की संरचना से पहले ardeDeleteOperationArray = [{"id": 3.1, "name": "test 3.1", "activityDetails": [{"id": 22, "name": "3.1"} का उपयोग करें। {"आईडी": २३, "नाम": "परिवर्तित परीक्षण २३"}]]] और मैं आईडी हटाना चाहता हूं: २३
भूल से

स्पष्ट रूप से, लेकिन अगर आप केवल एक अद्वितीय तत्व को हटाने की उम्मीद कर रहे हैं, तो आप प्रदर्शन के लिए 'यदि' कथन में एक ब्रेक फेंक सकते हैं, तो लूप शेष सरणी पर पुनरावृति नहीं करता है।
पैट्रिक बोरोविक्ज़

@Klors समझाने के लिए धन्यवाद। क्या यह हमेशा अच्छा है कि जवाब में सरणी को पीछे की तरफ पढ़ें?
किट्टू

37

मान लें कि आप फ़ील्ड प्रॉपर्टी द्वारा दूसरी ऑब्जेक्ट हटाना चाहते हैं।

ES6 के साथ यह इतना आसान है।

myArray.splice(myArray.findIndex(item => item.field === "cStatus"), 1)

6
मैंने यह कोशिश की लेकिन ओपी के ऐरे से "3" आइटम को हटाने के बजाय, आपके कोड को "फ़िल्टर किया गया" और केवल 3 आइटम को प्रदर्शित किया।
कॉम्पैक LE2202x

1
@ CompaqLE2202x 2 साल बाद यह शायद आपके लिए पहले से ही स्पष्ट है, लेकिन भविष्य के डेवलपर्स के लिए: spliceमूल सरणी को बदलता है, इसलिए आपको जो मूल्य वापस मिलता है वह वह आइटम है जिसे हटा दिया गया था, लेकिन यदि आप myArrayआइटम को अगली बार देखते हैं तो गायब हो जाएगा।
डेविड मुल्डर

16

आप lodash का उपयोग कर सकते findIndex विशिष्ट तत्व के सूचकांक पाने के लिए और फिर इसे का उपयोग कर ब्याह।

myArray.splice(_.findIndex(myArray, function(item) {
    return item.value === 'money';
}), 1);

अपडेट करें

आप ES6 के findIndex () का भी उपयोग कर सकते हैं

FindIndex () विधि सरणी में पहले तत्व के सूचकांक को लौटाता है जो प्रदान किए गए परीक्षण फ़ंक्शन को संतुष्ट करता है। अन्यथा -1 वापस कर दिया जाता है।

myArray.splice(myArray.findIndex(myArray, function(item) {
    return item.value === 'money';
}), 1);

सरणी एक पेड़ की संरचना क्या है?
भूल से

@forgottofly पेड़ की संरचना? मुझे लगता myArrayहै कि यहाँ वस्तुओं की एक सरणी है।
श्रीधर

3
क्या होगा यदि सरणी ट्री स्ट्रक्चर वर्जन से पहले है vareperOperationArray = [{"id": 3.1, "name": "test 3.1", "activityDetails": [{"id": 22, "name": "3.1 परीक्षण"}, {"आईडी": २३, "नाम": "परिवर्तित परीक्षण २३"}]]] और मैं आईडी हटाना चाहता हूं: २३
भूल से

9

यहाँ jQuery grep का उपयोग करने का एक और विकल्प है। trueजीआरपी सुनिश्चित करने के लिए तीसरे फ़ंक्शन के रूप में पास करें जो आपके फ़ंक्शन से मेल खाता आइटम हटाता है।

users = $.grep(users, function(el, idx) {return el.field == "money"}, true)

यदि आप पहले से ही jQuery का उपयोग कर रहे हैं तो किसी शिम की आवश्यकता नहीं है, जो उपयोग करने के विपरीत उपयोगी हो सकता है Array.filter



3

निम्नलिखित कोड है यदि आप jQuery का उपयोग नहीं कर रहे हैं। डेमो

var myArray = [
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: 'money'}
];

alert(myArray.length);

for(var i=0 ; i<myArray.length; i++)
{
    if(myArray[i].value=='money')
        myArray.splice(i);
}

alert(myArray.length);

आप अंडरस्कोर लाइब्रेरी का भी उपयोग कर सकते हैं जिसमें बहुत सारे फ़ंक्शन हैं।

अंडरस्कोर जावास्क्रिप्ट के लिए एक उपयोगिता-बेल्ट लाइब्रेरी है जो बहुत अधिक कार्यात्मक प्रोग्रामिंग सहायता प्रदान करता है


5
यह वेब पर छोड़ने के लिए एक बहुत ही खतरनाक उदाहरण है ... यह उदाहरण डेटा के साथ काम करता है, लेकिन किसी और चीज के साथ नहीं। स्प्लिस (i) का अर्थ है कि यह सरणी में सभी तत्वों को हटा देगा जो पहली बार शुरू होने के बाद और जहां मूल्य पैसा है, जो नीचे से ऑप से आवश्यकता को पूरा नहीं करता है। यदि हम अलग हो गए (i, 1) तो यह अभी भी गलत होगा क्योंकि यह अगले अनुक्रमिक आइटम का मूल्यांकन नहीं करेगा (आपको मुझे भी घटाना होगा) यही कारण है कि आपको पीछे की ओर सरणियों में संचालन को संसाधित करना चाहिए, ताकि हटाने आइटम अगले आइटमों के अनुक्रमित को संसाधित करने के लिए परिवर्तित नहीं करता है
क्रिस स्कालर

3
var myArray = [
    {field: 'id', operator: 'eq', value: id}, 
    {field: 'cStatus', operator: 'eq', value: cStatus}, 
    {field: 'money', operator: 'eq', value: money}
];
console.log(myArray.length); //3
myArray = $.grep(myArray, function(element, index){return element.field == "money"}, true);
console.log(myArray.length); //2

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


3

लॉश लाइब्रेरी का उपयोग करना :

var myArray = [
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: 'money'}
];
var newArray = _.remove(myArray, function(n) {
  return n.value === 'money';;
});
console.log('Array');
console.log(myArray);
console.log('New Array');
console.log(newArray);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js"></script>


2

नीचे दिए गए कुछ टिप्पणियों के आधार पर एक कुंजी नाम और कुंजी मूल्य के आधार पर किसी वस्तु को निकालने का कोड है

 var items = [ 
  { "id": 3.1, "name": "test 3.1"}, 
  { "id": 22, "name": "test 3.1" }, 
  { "id": 23, "name": "changed test 23" } 
  ]

    function removeByKey(array, params){
      array.some(function(item, index) {
        return (array[index][params.key] === params.value) ? !!(array.splice(index, 1)) : false;
      });
      return array;
    }

    var removed = removeByKey(items, {
      key: 'id',
      value: 23
    });

    console.log(removed);

1

jAndy का समाधान शायद सबसे अच्छा है, लेकिन अगर आप फ़िल्टर पर भरोसा नहीं कर सकते हैं तो आप कुछ ऐसा कर सकते हैं:

var myArray = [
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: "money"}
];

myArray.remove_key = function(key){
    var i = 0, 
        keyval = null;
    for( ; i < this.length; i++){
        if(this[i].field == key){
            keyval = this.splice(i, 1);
            break;
        }
    }
    return keyval;
}

1
मैं फ़िल्टर () पर भरोसा क्यों नहीं कर पाऊंगा?
अफीम 2335

2
क्योंकि यह जावास्क्रिप्ट 1.6 का हिस्सा है, जो IE8 और उससे नीचे या पुराने ब्राउज़रों द्वारा समर्थित नहीं है।
रोब एम।

-1

लॉश लाइब्रेरी का उपयोग करना सरल है

_.remove(myArray , { field: 'money' });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.