বস্তুর সম্পত্তির উপর ভিত্তি করে অ্যারের উপাদানটি সরান


269

আমার কাছে এ জাতীয় সামগ্রীর অ্যারে রয়েছে:

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+
জেসেগাভিন

@ জেসেগাভিন সত্যিই। আমার উল্লেখ করা উচিত ছিল যে প্রচুর ভাল এস sh শিম লাইব্রেরি উপলব্ধ রয়েছে যা কার্যকারিতা অনুকরণ করে (কেবলমাত্র যদি আপনি লিগ্যাসি ব্রাউজারগুলিকে সমর্থন করতে চান)
জ্যান্ডি

3
filter()একটি নতুন অ্যারে তৈরি করে, যা ঠিক আছে যদি আপনি ভেরিয়েবলটি পুনরায় নিয়োগ করতে সক্ষম হন এবং জেনে থাকুন যে কোডের অন্যান্য ক্ষেত্র নেই যার সাথে উল্লেখ রয়েছে ferences আপনার বিশেষভাবে মূল অ্যারে অবজেক্টটি সংশোধন করা দরকার হলে এটি কাজ করবে না।
ব্রায়ান গ্লিক

2
অ্যারেলিডলিওরেপেশন অ্যারে এর আগে একটি ট্রি স্ট্রাকচার অ্যারে = তবে What "আইডি": 3.1, "নাম": "পরীক্ষা 3.1", "ক্রিয়াকলাপের বিবরণ": [{"আইডি": 22, "নাম": "পরীক্ষা 3.1"}, id "আইডি": 23, "নাম": "পরিবর্তিত পরীক্ষা 23"}]}] এবং আমি আইডিটি মুছতে চাই: 23
ভুলেও

@ forgottofly ভাল পয়েন্ট - উত্তর কেবল সীমিত ক্ষেত্রে কাজ করে। আপনি কি আপনার প্রশ্নের উত্তর খুঁজে পেয়েছেন?
জ্যাক দ্যনাফ

88

অ্যারে দিয়ে ইটারেট করুন এবং spliceযা আপনি চান না তা খুঁজে বের করুন। সহজ ব্যবহারের জন্য পিছনে পুনরাবৃত্তি করুন যাতে আপনাকে অ্যারের লাইভ প্রকৃতিটি বিবেচনায় নিতে হবে না:

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

3
অ্যারের লাইভ প্রকৃতি বলতে কী বোঝ? @ নাইট দ্য ডার্ক
আবসোল

29
@ সিসিমহ তার অর্থ আপনি যদি কোনও অ্যারের উপরে পুনরাবৃত্তিটি পুনরুক্তি যুক্তির অংশ হিসাবে এবং এর দৈর্ঘ্যের পরিবর্তনগুলি ব্যবহার করে কারণ এতে উপাদানগুলি সরিয়ে দেওয়া হয়েছে বা যুক্ত করা হয়েছে তবে আপনি অ্যারের শেষের দিকে দৌড়াতে পারেন বা অপারেশন না করে চলেছেন অ্যারেতে প্রতিটি আইটেম পেছনের দিকে যাওয়ার ফলে এটি চলমান দৈর্ঘ্যের চেয়ে স্থিতিশীল 0 সূচকের দিকে কাজ করার কারণে কম সম্ভাবনা তৈরি করে।
ক্লার্স

2
অ্যারেলিডলিওরেপেশন অ্যারে এর আগে একটি ট্রি স্ট্রাকচার অ্যারে = তবে What "আইডি": 3.1, "নাম": "পরীক্ষা 3.1", "ক্রিয়াকলাপের বিবরণ": [{"আইডি": 22, "নাম": "পরীক্ষা 3.1"}, id "আইডি": 23, "নাম": "পরিবর্তিত পরীক্ষা 23"}]}] এবং আমি আইডিটি মুছতে চাই: 23
ভুলেও

কিন্ডা সুস্পষ্ট তবে আপনি যদি কেবল একটি একক অনন্য উপাদান অপসারণের প্রত্যাশা করছেন তবে আপনি পারফরম্যান্সের জন্য 'if' স্টেটমেন্টের মধ্যে একটি বিরতি ফেলতে পারেন যাতে লুপটি অनावश्यकভাবে বাকি অ্যারের উপরে পুনরুক্তি না করে।
প্যাট্রিক বোরকোভিজ

ক্লার্স ব্যাখ্যা করার জন্য ধন্যবাদ। উত্তরের মতো অ্যারেটি সবসময় পিছনের দিকে পড়া ভাল?
কিট্টু

37

বলুন আপনি দ্বিতীয় ক্ষেত্রের ক্ষেত্রের সম্পত্তি দ্বারা এটি সরাতে চান।

ES6 এর সাথে এটি এর মতো সহজ।

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

6
আমি এটি চেষ্টা করেছিলাম তবে ওপি'র অ্যারে থেকে 3 য় আইটেমটি "অপসারণ" পরিবর্তে আপনার কোডটি "ফিল্টারড" করে এবং কেবলমাত্র 3 য় আইটেমটি প্রদর্শিত হয়েছে।
কমপ্যাক LE2202x

1
@ CompaqLE2202x 2 বছর পরে এটি সম্ভবত আপনার কাছে ইতিমধ্যে সুস্পষ্ট, তবে ভবিষ্যতের বিকাশকারীদের জন্য: spliceমূল অ্যারে পরিবর্তন করে, সুতরাং যে মানটি আপনি ফিরে পাবেন তা সেই আইটেমটি সরানো হয়েছিল, তবে আপনি যদি পরবর্তী myArrayআইটেমটি দেখুন তবে এটি অনুপস্থিত হবে।
ডেভিড মুলদার

16

আপনি নির্দিষ্ট উপাদানের সূচক পেতে লড্যাশের ফাইন্ড ইন্ডেক্স ব্যবহার করতে পারেন এবং তারপরে এটি ব্যবহার করে বিচ্ছিন্ন করতে পারেন।

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

হালনাগাদ

আপনি ES6 এর ফাইন্ড ইন্ডেক্স () ব্যবহার করতে পারেন

FindIndex () পদ্ধতি অ্যারেতে প্রথম উপাদানটির সূচক প্রদান করে যা সরবরাহিত পরীক্ষামূলক ক্রিয়াকে সন্তুষ্ট করে। অন্যথায় -1 ফেরত দেওয়া হয়।

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

অ্যারে একটি গাছ কাঠামো কি?
forgottofly

@ ফরগোটফ্লাই গাছ কাঠামো? আমি মনে করি myArrayএখানে বস্তুর একটি অ্যারে রয়েছে।
শ্রীধর

3
অ্যারেডিলিপোপরেশনআরে = [pe "আইডি": 3.1, "নাম": "পরীক্ষা 3.1", "ক্রিয়াকলাপের বিবরণ": [{"আইডি": 22, "নাম": "পরীক্ষা 3.1" before, id "আইডি": 23, "নাম": "পরিবর্তিত পরীক্ষা 23"}]}] এবং আমি আইডি মুছতে চাই: 23
ভুলেও

9

JQuery গ্রেপ ব্যবহার করে এখানে অন্য বিকল্প। 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
আমি কেন ফিল্টার () এ ভরসা রাখতে পারব না?
imperium2335

2
কারণ এটি জাভাস্ক্রিপ্ট ১.6 এর একটি অংশ যা আই 8 এবং নীচে বা পুরানো ব্রাউজারগুলির দ্বারা সমর্থিত নয়।
রব এম

-1

লোডাশ লাইব্রেরি ব্যবহার করে এটি এটি সহজ

_.remove(myArray , { field: 'money' });
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.