জাভাস্ক্রিপ্ট মূল মানের উপর ভিত্তি করে অ্যারেতে অবজেক্টটি সন্ধান এবং সরিয়ে ফেলবে


138

আমি অ্যারেতে কীভাবে কোনও বস্তু সন্ধান করতে পারি সে সম্পর্কে আমি বেশ কয়েকটি পদ্ধতির চেষ্টা করে যাচ্ছি, যেখানে ID = var, এবং যদি পাওয়া যায় তবে অ্যারে থেকে অবজেক্টটি সরিয়ে নিয়ে নতুন বস্তুর নতুন অ্যারেটি ফিরিয়ে আনব।

ডেটা:

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

আমি jQuery $ গ্রেপ ব্যবহার করে অ্যারেটি অনুসন্ধান করতে সক্ষম;

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
অবশ্যই, তবে, আমি এই প্রশ্নটি লেখার কারণটি কি আমি আটকা পড়েছি;) কোনও স্নিপেট?
টম


শিরোনাম এবং প্রশ্নের পাঠ্য বিরোধী বলে মনে হচ্ছে ... দুটি সম্পূর্ণ ভিন্ন পদ্ধতির পরামর্শ দিচ্ছে: A. বি অ্যারে অ্যারে থেকে আইটেমগুলি সরান একটি নতুন, ফিল্টার করা অ্যারে তৈরি করুন।
ক্যানন

উত্তর:


155

আমি আইডিটির জন্য অ্যারে গ্রেপ করতে পারি, তবে আমি কীভাবে পুরো বস্তুটি মুছতে পারি যেখানে ID == 88

কেবল বিপরীত শিকারের মাধ্যমে ফিল্টার করুন:

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

12
এই উত্তরটি jQuery
ব্রায়ান

1
আপনার ক্ষেত্রে যেখানে আপনি আইডিতে সমস্ত আইটেম মুছতে চান = কিছু ঠিক আছে ... তবে $ .grep ব্যবহার করার সময় সতর্কতা অবলম্বন করুন কারণ এটি সম্পূর্ণ অ্যারেটি অনুসন্ধান করে এবং দীর্ঘ অ্যারেগুলির জন্য এটি দক্ষ নয়। কখনও কখনও আপনাকে কেবল কোনও প্রদত্ত আইডি দ্বারা অ্যারের ভিতরে উপাদান উপস্থিত রয়েছে কিনা তা
খতিয়ে দেখা দরকার

1
এটি সেই বস্তুটি তালিকা থেকে সরাবে না
অরুণ সিভান

1
@ অরুনসিভান sliceকোনও কিছুই অপসারণ করে না। আপনি কী পাচ্ছেন তা নিশ্চিত নয়। যদি আপনার নিজের একটি নির্দিষ্ট সমস্যা থাকে তবে আপনি একটি নতুন প্রশ্ন জিজ্ঞাসা করতে পারেন ।
বার্গি

1
@Learnerdata.filter(e => !ids.includes(e.id))
বার্গি

151

আপনি jquery ব্যবহার না করা হলে এখানে একটি সমাধান দেওয়া হয়েছে:

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

2
এই কাজ বেশী ভালো findIndex()এবং তারপর splice(index, 1)পিতা বা মাতা অ্যারের উপর?
অ্যালেক্স

বিভাজক উত্স অ্যারে পরিবর্তন। ফিল্টার সহ আপনার পছন্দ আছে।
উলফ

13
আপনি এটি ব্যবহার করে একক লাইনে হ্রাস করতে পারবেন: myArr = myArray.filter (obj => obj.id! == id);
DBrown

2
আরও সংক্ষিপ্তarr = arr.filter( obj => obj.id !== id);
ওমর

86

আপনি এটি সরল করতে পারেন, এবং এখানে jquery ব্যবহার করার দরকার নেই need

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--
distante

31

ফাইন্ড ইন্ডেক্স এবং অ্যারে স্প্রেড অপারেটরটি ব্যবহার করে ES6 / 2015 এ এটি করার জন্য একটি নতুন পদ্ধতি রয়েছে:

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.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 অ্যারে.প্রোটোটাইপ.ফিল্টার ব্যবহার করে :

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

1
Noooooo! jQueryফিল্টার হিসাবে মানচিত্র ব্যবহার করবেন না ।
বার্গি

1
একমত! গ্রেপ সহ আপনার সমাধানটি jQuery সহ সঠিক সমাধান।
nekman

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এটির মতো ক্রিয়াকলাপের জন্য আরও অনেক উন্নতগুলির একটি শক্তিশালী সংগ্রহ ফিল্টার is এটি ব্রাউজারে ক্লায়েন্ট সাইড বা node.js এ সার্ভার সাইডে কাজ করে

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 সংগ্রহ ফিল্টারিং যাবে।


কেন কোনও উচ্ছ্বাস নেই? যদি এই জিনিসটি সঠিকভাবে লিখিত হয় এবং কোনও ভয়ঙ্কর বাগ না থাকে তবে এটি অবশ্যই ব্যবহারযোগ্য use
ম্যাক্স ইয়ারি

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];
  });
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.