जावास्क्रिप्ट कुंजी के आधार पर सरणी में ऑब्जेक्ट को ढूंढते और हटाते हैं


139

मैं सरणी में किसी ऑब्जेक्ट को खोजने के लिए कई तरीकों की कोशिश कर रहा हूं, जहां ID = var, और यदि पाया जाता है, तो ऑब्जेक्ट को सरणी से हटा दें और ऑब्जेक्ट की नई सरणी लौटाएं।

डेटा:

[
    {"id":"88","name":"Lets go testing"},
    {"id":"99","name":"Have fun boys and girls"},
    {"id":"108","name":"You are awesome!"}
]

मैं jQuery $ grep का उपयोग करके सरणी को खोजने में सक्षम हूं;

var id = 88;

var result = $.grep(data, function(e){ 
     return e.id == id; 
});

लेकिन id == 88, और डेटा को इस तरह वापस करने पर मैं संपूर्ण ऑब्जेक्ट को कैसे हटा सकता हूं:

डेटा:

[
    {"id":"99","name":"Have fun boys and girls"},
    {"id":"108","name":"You are awesome!"}
]

sliceफ़ंक्शन और थोड़ा forलूप का उपयोग करने के बारे में क्या ?
अहमद हमी

1
ज़रूर, लेकिन, कारण है कि मैंने यह सवाल लिखा है, क्योंकि मैं फंस गया हूं?) कोई स्निपेट?
टॉम

इस पोस्ट की जांच करें stackoverflow.com/questions/10827894/…
अहमद हम्दी

शीर्षक और प्रश्न पाठ संघर्ष के लिए लगता है ... दो पूरी तरह से अलग दृष्टिकोण का सुझाव देते हैं: बनाम बी से आइटम हटा दें एक नया, फ़िल्टर किया गया सरणी बनाएं।
कैनन

जवाबों:


155

मैं आईडी के लिए सरणी को पकड़ सकता हूं, लेकिन मैं पूरी वस्तु को कैसे हटा सकता हूं जहां आईडी == 88

बस विपरीत विधेय द्वारा फ़िल्टर करें:

var data = $.grep(data, function(e){ 
     return e.id != id; 
});

12
यह उत्तर jQuery के लिए सबसे संक्षिप्त और मुहावरेदार समाधान प्रदान करता है
ब्रायन

1
आपके मामले में जहां आप आईडी के साथ सभी आइटम हटाना चाहते हैं = कुछ ठीक है ... लेकिन $ .grep का उपयोग करते समय सावधान रहें क्योंकि यह पूर्ण सरणी की खोज करता है और लंबे समय तक सरणियों के लिए यह कुशल नहीं है। कभी-कभी आपको बस यह जांचने की आवश्यकता होती है कि क्या तत्व किसी दिए गए आईडी द्वारा सरणी के अंदर मौजूद है, तो एक और पुनरावृत्ति विधि का उपयोग करना बेहतर है;)
जूलियनॉक्स

1
यह सूची से उस वस्तु को नहीं हटाता है
अरुण सिवन

1
@ArunSivan sliceकुछ भी नहीं हटाता है। सुनिश्चित नहीं हैं कि आप क्या कर रहे हैं। यदि आपको स्वयं कोई विशिष्ट समस्या है, तो आप एक नया प्रश्न पूछना चाहते हैं ।
बरगी

1
@Learnerdata.filter(e => !ids.includes(e.id))
Bergi

153

यहाँ एक समाधान है अगर आप jquery का उपयोग नहीं कर रहे हैं:

myArray = myArray.filter(function( obj ) {
  return obj.id !== id;
});

2
क्या यह करने से बेहतर है findIndex()और फिर splice(index, 1)मूल सरणी पर?
एलेक्स

ब्याह मूल सरणी को बदल देता है। फ़िल्टर के साथ आपके पास विकल्प है।
velop

13
आप इसका उपयोग करके इसे एक पंक्ति में कम कर सकते हैं: myArr = myArray.filter (obj => obj.id! == id);
DBrown

2
इससे भी अधिक संक्षिप्तarr = arr.filter( obj => obj.id !== id);
उमर

86

आप इसे सरल कर सकते हैं, और वास्तव में यहाँ jquery का उपयोग करने की कोई आवश्यकता नहीं है।

var id = 88;

for(var i = 0; i < data.length; i++) {
    if(data[i].id == id) {
        data.splice(i, 1);
        break;
    }
}

सूची के माध्यम से पुनरावृति, मिलान आईडी, ब्याह और फिर अपने पाश से बाहर निकलने के लिए तोड़ दें


17
+1, लेकिन आपको यह उल्लेख करना चाहिए कि यह केवल पहले आइटम को हटाता है जो मेल खाता है।
बरगी

6
... और यदि आपको प्रत्येक मिलान किए गए आइटम को हटाने की आवश्यकता है, तो रिवर्स ऑर्डर पर लूप के साथ i=data.length; i > 0; i--और उपयोग न करें break
जेरेमी बेलोलो

3
i = data.lengthकोई भी तोड़ देगा data[i], यह कुछ इस तरह होना चाहिएi=data.length -1 ; i > -1; i--
डिस्टेंट नं

31

ईएस 6/2015 में ऐसा करने के लिए एक नया तरीका है findIndex और array प्रसार ऑपरेटर का उपयोग करना:

const index = data.findIndex(obj => obj.id === id);
const newData = [
    ...data.slice(0, index),
    ...data.slice(index + 1)
]

आप इसे बाद में पुन: उपयोग के लिए एक फ़ंक्शन में बदल सकते हैं:

function remove(array, key, value) {
    const index = array.findIndex(obj => obj[key] === value);
    return index >= 0 ? [
        ...array.slice(0, index),
        ...array.slice(index + 1)
    ] : array;
}

इस तरह से आप एक विधि का उपयोग करके विभिन्न कुंजी द्वारा आइटम निकाल सकते हैं (और यदि कोई वस्तु नहीं है जो मानदंडों को पूरा करती है, तो आपको मूल सरणी वापस मिल जाती है):

const newData = remove(data, "id", "88");
const newData2 = remove(data, "name", "You are awesome!");

या आप इसे अपने Array.prototype पर रख सकते हैं:

Array.prototype.remove = function (key, value) {
    const index = this.findIndex(obj => obj[key] === value);
    return index >= 0 ? [
        ...this.slice(0, index),
        ...this.slice(index + 1)
    ] : this;
};

और इसे इस तरह से उपयोग करें:

const newData = data.remove("id", "88");
const newData2 = data.remove("name", "You are awesome!");

findIndex () वास्तव में बहुत अच्छा है! 👍
डेनियलक्रैगी

9

यह मानते हुए कि आईडी अद्वितीय हैं और आपको केवल एक ही तत्व को निकालना होगा splice:

var data = [
  {"id":"88","name":"Lets go testing"},
  {"id":"99","name":"Have fun boys and girls"},
  {"id":"108","name":"You are awesome!"}
],
id = 88;

console.table(data);

$.each(data, function(i, el){
  if (this.id == id){
    data.splice(i, 1);
  }
});

console.table(data);

आपके कॉलबैक फ़ंक्शन में तत्व पीछे की ओर हैं। यह होना चाहिए each(data,function(idx,ele)। मैं आपको बाद में उस 30 मिनट के लिए बिल
भेजूंगा

उफ़। उस मामले में कम से कम मैं कर सकता हूं मेरे जवाब को अपडेट करें। मुझे आपके जीवन के 30 मिनट बर्बाद करने में बहुत बुरा लगता है।
जेम्स हिब्बार्ड

5
var items = [
  {"id":"88","name":"Lets go testing"},
  {"id":"99","name":"Have fun boys and girls"},
  {"id":"108","name":"You are awesome!"}
];

यदि आप jQuery का उपयोग कर रहे हैं, तो उपयोग करें jQuery.grep का करें:

items = $.grep(items, function(item) { 
  return item.id !== '88';
});
// items => [{ id: "99" }, { id: "108" }]

ES5 Array.prototype.filter का उपयोग करना :

items = items.filter(function(item) { 
  return item.id !== '88'; 
});
// items => [{ id: "99" }, { id: "108" }]

1
Noooooo! jQueryफ़िल्टर के रूप में मानचित्र का उपयोग न करें ।
बरगी

1
इस बात से सहमत! Grep के साथ आपका समाधान jQuery के साथ सही समाधान है।
नेकमैन

4

शायद आप $.grep()फंक्शन की तलाश में हैं:

arr = [
  {"id":"88","name":"Lets go testing"},
  {"id":"99","name":"Have fun boys and girls"},
  {"id":"108","name":"You are awesome!"}
];

id = 88;
arr = $.grep(arr, function(data, index) {
   return data.id != id
});

3

siftइस तरह के संचालन और अधिक उन्नत लोगों के लिए एक शक्तिशाली संग्रह फ़िल्टर है। यह ब्राउज़र में क्लाइंट साइड या नोड पक्ष में काम करता है।

var collection = [
    {"id":"88","name":"Lets go testing"},
    {"id":"99","name":"Have fun boys and girls"},
    {"id":"108","name":"You are awesome!"}
];
var sifted = sift({id: {$not: 88}}, collection);

ऐसा लगता है कि फिल्टर का समर्थन करता है $in, $nin, $exists, $gte, $gt, $lte, $lt, $eq, $ne, $mod, $all, $and, $or, $nor, $not, $size, $type, और $regex, और प्रयास एपीआई-संगत के साथ MongoDB संग्रह छानने किया जाना है।


कोई उलाहना क्यों? यदि यह बात ठीक से लिखी गई है और इसमें कोई भयानक कीड़े नहीं हैं, तो इसे बहुत उपयोगी होना चाहिए।
मैक्स यारी

2
Array.prototype.removeAt = function(id) {
    for (var item in this) {
        if (this[item].id == id) {
            this.splice(item, 1);
            return true;
        }
    }
    return false;
}

यह चाल, jsfiddle करना चाहिए


0

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

var result = $.grep(data, function(e, i) { 
  return +e.id !== id;
});

डेमो


0

यदि आप अंडरस्कोर जेएस का उपयोग कर रहे हैं, तो कुंजी के आधार पर ऑब्जेक्ट को निकालना आसान है। http://underscorejs.org । उदाहरण:

  var temp1=[{id:1,name:"safeer"},  //temp array
             {id:2,name:"jon"},
             {id:3,name:"James"},
             {id:4,name:"deepak"},
             {id:5,name:"ajmal"}];

  var id = _.pluck(temp1,'id'); //get id array from temp1
  var ids=[2,5,10];             //ids to be removed
  var bool_ids=[];
  _.each(ids,function(val){
     bool_ids[val]=true;
  });
  _.filter(temp1,function(val){
     return !bool_ids[val.id];
  });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.