বস্তুর সম্পত্তি দ্বারা অ্যারে থেকে অবজেক্টগুলি সরান


137
var listToDelete = ['abc', 'efg'];

var arrayOfObjects = [{id:'abc',name:'oh'}, // delete me
                      {id:'efg',name:'em'}, // delete me
                      {id:'hij',name:'ge'}] // all that should remain

আমি কীভাবে অ্যারে থেকে কোনও বস্তুটির বৈশিষ্ট্যের সাথে মিল রেখে অপসারণ করব?

শুধুমাত্র নেটিভ জাভাস্ক্রিপ্ট দয়া করে।

স্প্লাইস ব্যবহার করতে আমার সমস্যা হচ্ছে কারণ প্রতিটি মুছে ফেলার সাথে দৈর্ঘ্য হ্রাস পায়। ক্লোন ব্যবহার করে এবং অরিগেনাল সূচকগুলিতে বিভক্ত করা আপনাকে দৈর্ঘ্য হ্রাস করার সমস্যা থেকে ফেলে দেয়।


1
পিছনের দিকে লুপ করা দৈর্ঘ্যের সমস্যার পরিবর্তনটি ঠিক করা উচিত
আয়ান

1
এটি এমন লজ্জাজনক যে কোনও বস্তুর অ্যারে থেকে আইটেমগুলি সরিয়ে নেওয়ার কোনও আদর্শ মানের উপায় নেই। এতে তৃতীয় পক্ষের স্ক্রিপ্টগুলি আশ্চর্যজনক নয়। এটি একটি মৌলিক জিনিস।
গিটারগ্লাস 4

উত্তর:


155

আমি ধরে নিলাম আপনি spliceএই জাতীয় কিছু ব্যবহার করেছেন?

for (var i = 0; i < arrayOfObjects.length; i++) {
    var obj = arrayOfObjects[i];

    if (listToDelete.indexOf(obj.id) !== -1) {
        arrayOfObjects.splice(i, 1);
    }
}

ত্রুটি ঠিক করতে আপনার যা করতে হবে তা হ'ল iপরবর্তী সময়ের জন্য হ্রাস , তারপরে (এবং পিছনের দিকে লুপ করাও একটি বিকল্প):

for (var i = 0; i < arrayOfObjects.length; i++) {
    var obj = arrayOfObjects[i];

    if (listToDelete.indexOf(obj.id) !== -1) {
        arrayOfObjects.splice(i, 1);
        i--;
    }
}

রৈখিক-সময় মুছে ফেলা এড়াতে, আপনি অ্যারের উপরে রাখতে চান এমন অ্যারে উপাদানগুলি লিখতে পারেন :

var end = 0;

for (var i = 0; i < arrayOfObjects.length; i++) {
    var obj = arrayOfObjects[i];

    if (listToDelete.indexOf(obj.id) === -1) {
        arrayOfObjects[end++] = obj;
    }
}

arrayOfObjects.length = end;

এবং আধুনিক রানটাইমে লিনিয়ার-টাইম লুকআপগুলি এড়াতে আপনি একটি হ্যাশ সেট ব্যবহার করতে পারেন:

const setToDelete = new Set(listToDelete);
let end = 0;

for (let i = 0; i < arrayOfObjects.length; i++) {
    const obj = arrayOfObjects[i];

    if (setToDelete.has(obj.id)) {
        arrayOfObjects[end++] = obj;
    }
}

arrayOfObjects.length = end;

যা একটি সুন্দর ফাংশনে আবৃত হতে পারে:

const filterInPlace = (array, predicate) => {
    let end = 0;

    for (let i = 0; i < array.length; i++) {
        const obj = array[i];

        if (predicate(obj)) {
            array[end++] = obj;
        }
    }

    array.length = end;
};

const toDelete = new Set(['abc', 'efg']);

const arrayOfObjects = [{id: 'abc', name: 'oh'},
                        {id: 'efg', name: 'em'},
                        {id: 'hij', name: 'ge'}];

filterInPlace(arrayOfObjects, obj => !toDelete.has(obj.id));
console.log(arrayOfObjects);

আপনার যদি এটি জায়গায় না করার দরকার হয় তবে তা হ'ল Array#filter:

const toDelete = new Set(['abc', 'efg']);
const newArray = arrayOfObjects.filter(obj => !toDelete.has(obj.id));

79

আপনি কোনও আইটেমকে এর মতো কোনও তৃতীয় পক্ষের libs ব্যবহার না করে এর একটি বৈশিষ্ট্য দ্বারা সরিয়ে ফেলতে পারেন:

var removeIndex = array.map(item => item.id)
                       .indexOf("abc");

~removeIndex && array.splice(removeIndex, 1);

1
এটি একটি সত্যিই মার্জিত উত্তর।
স্কট সিলভি

আমি চাই অন্য জিনিস, অ্যারে প্রতিটি বস্তুর জন্য পৃথক বাটন থাকবে। যদি আমি অ্যারে বাটনে ক্লিক করা সেই নির্দিষ্ট অবজেক্টটি মুছতে চাই এবং তা অন্য একটি সেকেন্ডারি অ্যারেতে স্থানান্তরিত করা উচিত। এটা কিভাবে করতে হবে . আমি আইটেম তৈরি করতে কৌণিক জেএস এনজি-রিপিট ব্যবহার করেছি। আপনি কি আমাকে সাহায্য করতে পারেন
21:56

খুব সুন্দর এবং মার্জিত পদ্ধতির। গৌরব! সাবধানতার জন্য কেবল একটি জিনিস; যদি প্রয়োজনীয় সূচক মানচিত্রে অ্যারেটিতে পাওয়া যায় না, তবে এটি ফেরত আসবে -1; এভাবে স্প্লাইস শেষ উপাদানটি সরিয়ে ফেলবে।
mcy

15
বা যদি আপনি শেষ লাইনে টিলডের দ্বারা বিভ্রান্ত হন তবে আপনি এটি আরও স্পষ্ট দেখতে পাবেন: (সরানোআইডেক্স> = 0) && অ্যারে.স্প্লাইস (রিয়েলআইডেক্স, 1);
wojjas

1
@ সংসদ - আপনার উদাহরণে টিলডে কোনও ডকুমেন্টেশন আছে কি? আমি এর আগে কখনও দেখিনি।
ওয়েবদাদ3

43

লোডাশ / আন্ডারস্কোর সহ:

আপনি যদি বিদ্যমান অ্যারে নিজেই সংশোধন করতে চান তবে আমাদের স্প্লাইস ব্যবহার করতে হবে । আন্ডারস্কোর / লড্যাশের সন্ধানের জন্য এখানে আরও ভাল / পঠনযোগ্য উপায় রয়েছে:

var items= [{id:'abc',name:'oh'}, // delete me
                  {id:'efg',name:'em'},
                  {id:'hij',name:'ge'}];

items.splice(_.indexOf(items, _.findWhere(items, { id : "abc"})), 1);

ES5 বা উচ্চতর সহ

( লোটাস / আন্ডারস্কোর ছাড়াই )

ES5 এর পরে আমাদের findIndexঅ্যারেতে পদ্ধতি রয়েছে, সুতরাং এটি লড্যাশ / আন্ডারস্কোর ছাড়াই সহজ

items.splice(items.findIndex(function(i){
    return i.id === "abc";
}), 1);

(ES5 প্রায় সমস্ত মোডেন ব্রাউজারগুলিতে সমর্থিত)

FindIndex , এবং এর ব্রাউজারের সামঞ্জস্যতা সম্পর্কে


আমি কীভাবে সমস্ত আইটেমের
অ্যারেগুলিতে

কলব্যাক বলতে কী বোঝাতে চেয়েছেন, আপনি অ্যারে থেকে অবজেক্টটি সরাতে উপরের কোডটি ব্যবহার করতে পারেন ..
রাহুল আর

1
সুন্দর. আমি এটি আমার টুলবেলেটে যুক্ত করব
abyrne85

আমি চাই অন্য জিনিস, অ্যারে প্রতিটি বস্তুর জন্য পৃথক বাটন থাকবে। যদি আমি অ্যারে বাটনে ক্লিক করা সেই নির্দিষ্ট অবজেক্টটি মুছতে চাই এবং তা অন্য একটি সেকেন্ডারি অ্যারেতে স্থানান্তরিত করা উচিত। এটা কিভাবে করতে হবে . আমি আইটেম তৈরি করতে কৌণিক জেএস এনজি-রিপিট ব্যবহার করেছি। আপনি কি আমাকে সাহায্য করতে পারেন
21:56

1
এই ES5 পরামর্শটি পছন্দ করুন, কারণ এটি আরও ছোট items.splice(items.findIndex(i => i.id === "abc"), 1)
উপায়েও

27

FindIndex আধুনিক ব্রাউজারগুলির জন্য কাজ করে:

var myArr = [{id:'a'},{id:'myid'},{id:'c'}];
var index = arr.findIndex(function(o){
     return o.id === 'myid';
})
if (index !== -1) myArr.splice(index, 1);

আমি এই আধুনিক উত্তরটি পছন্দ করি, যদি আপনার কোডটি
কেসটি ধরেনা বাদে

2
অন্যের তুলনায় খুব সাধারণ উত্তর এবং ঠিক কাজ করে।
অরুন

সহজ এখনও পাওয়ারফুল অ্যাঞ্জার
শেলী

15

প্রদত্ত অ্যারেতে কোনও আইডিটিকে আইডি দ্বারা মুছতে;

const hero = [{'id' : 1, 'name' : 'hero1'}, {'id': 2, 'name' : 'hero2'}];
//remove hero1
const updatedHero = hero.filter(item => item.id !== 1);

10

আপনি যদি এটি বিদ্যমান অ্যারে থেকে সরাতে এবং একটি নতুন তৈরি না করতে চান তবে চেষ্টা করুন:

var items = [{Id: 1},{Id: 2},{Id: 3}];
items.splice(_.indexOf(items, _.find(items, function (item) { return item.Id === 2; })), 1);

7
লক্ষ্য করুন যে এই উত্তরটির আন্ডারস্কোর লাইব্রেরি প্রয়োজন
জোশুয়া ডেভিড

2
আমি এটির সুপারিশ করব না কারণ যদি উপাদানটি খুঁজে পাওয়া যায় না তবে _ ইনডেক্সফ -1 => আইটেমগুলি স্পষ্ট করে (-1,1)
ব্যবহারকারীর 1441287

6

iসমস্যা এড়াতে হ্রাস করে বিপরীতে লুপ :

for (var i = arrayOfObjects.length - 1; i >= 0; i--) {
    var obj = arrayOfObjects[i];

    if (listToDelete.indexOf(obj.id) !== -1) {
        arrayOfObjects.splice(i, 1);
    }
}

বা ব্যবহার করুন filter:

var newArray = arrayOfObjects.filter(function(obj) {
    return listToDelete.indexOf(obj.id) === -1;
});

5

সেট এবং ইএস 6 ফিল্টার ব্যবহার করে এটি পরীক্ষা করে দেখুন।

  let result = arrayOfObjects.filter( el => (-1 == listToDelete.indexOf(el.id)) );
  console.log(result);

এখানে জেএসফিডাল: https://jsfiddle.net/jsq0a0p1/1/


1
পুরোপুরি কাজ করে!
আন্তোনি কেপিনস্কি

আমার দৃষ্টিতে সর্বাধিক আধুনিক এবং মার্জিত পদ্ধতির।
এসি প্যাট্রিস

4

শুধুমাত্র নেটিভ জাভাস্ক্রিপ্ট দয়া করে।

ECMAScript 5 এ কাজ করে বিকল্প হিসাবে আরও "কার্যকরী" সমাধান হিসাবে আপনি ব্যবহার করতে পারেন:

var listToDelete = ['abc', 'efg'];
var arrayOfObjects = [{id:'abc',name:'oh'}, // delete me
                      {id:'efg',name:'em'}, // delete me
                      {id:'hij',name:'ge'}]; // all that should remain

arrayOfObjects.reduceRight(function(acc, obj, idx) {
    if (listToDelete.indexOf(obj.id) > -1)
        arrayOfObjects.splice(idx,1);
}, 0); // initial value set to avoid issues with the first item and
       // when the array is empty.

console.log(arrayOfObjects);
[ { id: 'hij', name: 'ge' } ]

ইসিএমএ-262-তে 'অ্যারে.প্রোটোটাইপ.ড্রেস রাইট'-এর সংজ্ঞা অনুসারে :

হ্রাস রাইট সরাসরি যে বস্তুর উপর ডাকা হয় তা রূপান্তরিত করে না তবে কলটিকে কলব্যাকফনে পরিবর্তিত করতে পারে

সুতরাং এটি একটি বৈধ ব্যবহার reduceRight


2
var arrayOfObjects = [{id:'abc',name:'oh'}, // delete me
                      {id:'efg',name:'em'}, // delete me
                      {id:'hij',name:'ge'}] // all that should remain

আপনার উত্তর হিসাবে এই মত হবে। আপনি যখন কোনও নির্দিষ্ট অবজেক্ট ক্লিক করেন তখন মুছুন ফাংশনটির জন্য প্যারামে সূচকটি প্রেরণ করুন। এই সাধারণ কোডটি কবজির মতো কাজ করবে।

function deleteme(i){
    if (i > -1) {
      arrayOfObjects.splice(i, 1);
    }
}

1
থ্যাঙ্কস এটি অনেক সাহায্য করেছে :)
রাজেশ কুমার আর্মুগাম

1

ফিল্টার এবং সূচিপত্র সহ

withLodash = _.filter(arrayOfObjects, (obj) => (listToDelete.indexOf(obj.id) === -1));
withoutLodash = arrayOfObjects.filter(obj => listToDelete.indexOf(obj.id) === -1);

ফিল্টার সহ এবং অন্তর্ভুক্ত

withLodash = _.filter(arrayOfObjects, (obj) => (!listToDelete.includes(obj.id)))
withoutLodash = arrayOfObjects.filter(obj => !listToDelete.includes(obj.id));

0

আপনি যদি সংক্ষিপ্ত এবং স্ব বর্ণনামূলক পরামিতিগুলি পছন্দ করেন বা আপনি যদি spliceকোনও সরল ফরোয়ার্ড ফিল্টার ব্যবহার করতে এবং যেতে চান না বা যদি আপনি কেবল আমার মতো এসকিউএল ব্যক্তি হন:

function removeFromArrayOfHash(p_array_of_hash, p_key, p_value_to_remove){
    return p_array_of_hash.filter((l_cur_row) => {return l_cur_row[p_key] != p_value_to_remove});
}

এবং একটি নমুনা ব্যবহার:

l_test_arr = 
[
    {
         post_id: 1,
        post_content: "Hey I am the first hash with id 1"
    },
    {
        post_id: 2,
        post_content: "This is item 2"
    },
    {
        post_id: 1,
        post_content: "And I am the second hash with id 1"
    },
    {
        post_id: 3,
        post_content: "This is item 3"
    },
 ];



 l_test_arr = removeFromArrayOfHash(l_test_arr, "post_id", 2); // gives both of the post_id 1 hashes and the post_id 3
 l_test_arr = removeFromArrayOfHash(l_test_arr, "post_id", 1); // gives only post_id 3 (since 1 was removed in previous line)

-1

আপনি ব্যবহার করতে পারেন filter। শর্তটি সত্য হলে এই পদ্ধতিটি সর্বদা উপাদানটিকে ফেরত দেয়। সুতরাং আপনি যদি আইডির মাধ্যমে অপসারণ করতে চান তবে আপনাকে অবশ্যই সমস্ত উপাদান অবশ্যই রাখতে হবে যা প্রদত্ত আইডির সাথে মেলে না। এখানে একটি উদাহরণ:

অ্যারেঅফঅবজেক্টস = অ্যারেঅফবজেক্টস.ফিল্টার (আপত্তি => আপত্তি.আইডি! = আইডিটোরেভ)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.