আমি কীভাবে একটি তালিকা থেকে কোনও উপাদানকে লোডাস সহ সরিয়ে ফেলতে পারি?


165

আমার এমন একটি অবজেক্ট রয়েছে যা দেখতে দেখতে:

var obj = {
    "objectiveDetailId": 285,
    "objectiveId": 29,
    "number": 1,
    "text": "x",
    "subTopics": [{
        "subTopicId": 1,
        "number": 1
    }, {
        "subTopicId": 2,
        "number": 32
    }, {
        "subTopicId": 3,
        "number": 22
    }]
}
var stToDelete = 2;

আমি lodashআমার অ্যাপ্লিকেশনটিতে অন্যান্য জিনিসের জন্য ইনস্টল করেছি। প্রবেশটি lodashমোছার জন্য কোনও কার্যকর উপায় আছে : অবজেক্ট {"subTopicId":2, "number":32}থেকে obj?

অথবা এটি করার কোনও জাভাস্ক্রিপ্ট উপায় আছে?


1
তালিকা থেকে আইটেমটি সরাতে আপনি কেবল splice( developer.mozilla.org/en-US/docs/Web/JavaScript/References/… ) ব্যবহার করতে পারেন
z33m

1
শিরোনাম পরিবর্তন হয়েছে কারণ একটি অ্যারে [4,5] থেকে 4 সরানো এভাবে করা যায় না। হ্যাঁ, আমি বুঝতে পারি যে অ্যারেগুলি হ্যাশ / অবজেক্ট থেকে প্রয়োগ করা যেতে পারে এবং সম্ভবত এটি হয় তবে এই দুটিয়ের মধ্যে একটি সূক্ষ্ম পার্থক্য রয়েছে। একটি অ্যারে থেকে অপসারণ করতে আপনি এটি ব্যবহার result = _.pull(arr, value) করবেন এটি তালিকা থেকে সমস্ত মিলে যাওয়া মানগুলি সরিয়ে ফেলবে।
বোটকোডার

উত্তর:


247

লাইয়ানরা মন্তব্যগুলিতে যেমন উল্লেখ করেছে, এর জন্য আরও অহঙ্কারী ও লড্যাশী উপায় ব্যবহার করা হবে _.remove, এর মতো

_.remove(obj.subTopics, {
    subTopicId: stToDelete
});

তা ছাড়া, আপনি একটি প্রাকটিক ফাংশন পাস করতে পারেন যার ফলাফলটি বর্তমান উপাদানটি সরিয়ে ফেলতে হবে কিনা তা নির্ধারণ করতে ব্যবহৃত হবে।

_.remove(obj.subTopics, function(currentObject) {
    return currentObject.subTopicId === stToDelete;
});

বিকল্পভাবে, আপনি পুরানোটিকে ফিল্টার করে একটি নতুন অ্যারে তৈরি করতে _.filterএবং এটি একই বস্তুকে এ্যাসাইন করতে পারেন

obj.subTopics = _.filter(obj.subTopics, function(currentObject) {
    return currentObject.subTopicId !== stToDelete;
});

অথবা

obj.subTopics = _.filter(obj.subTopics, {subTopicId: stToKeep});

3
এই উত্তরটি কাঁপানোর কারণ হ'ল আপনি কোনও প্রাকটিক ফাংশন ব্যবহার করতে পারেন যা হুবহু আমি খুঁজছিলাম। আপনি যদি সূচকটি জানেন তবে একটি উপাদান অপসারণ তুচ্ছ, তবে আপনি যখন সূচকটি জানেন না তখন কী হবে ?
এলোমেলো_ ব্যবহারকারীর_নাম

3
আপনি যদি মূল অ্যারেটি পরিবর্তন করতে না চান তবে _ ফিল্টারটি উল্লেখ করার মতো হতে পারে ....
এলোমেলো_ ব্যবহারকারী_নাম

@ ক্যাল_বি আপনাকে ধন্যবাদ :-) _.filterসংস্করণ সহ উত্তরটি আপডেট করেছে ।
thefourtheye

7
প্রিফিকেটটি _.filter সত্য হলে @ থেফোর্তেয় একটি উপাদান ফেরত পাঠান । আপনার বাস্তবায়ন আপনি রাখতে চান তাদের পরিবর্তে সমস্ত অযাচিত উপাদানগুলি ফিরিয়ে দেবে
জেল্টোর

5
@ থেফোর্তে আপনি একই প্রিকিকেট ব্যবহার _.rejectনা করে ব্যবহার করা উচিত _.filter। আরও তথ্যের জন্য আমার উত্তর চেক করুন!
Xeltor

29

কেবল ভ্যানিলা জেএস ব্যবহার করুন। আপনি spliceউপাদানটি সরাতে ব্যবহার করতে পারেন:

obj.subTopics.splice(1, 1);

ডেমো


3
ব্যবহারকারী জিজ্ঞাসা করেছেনIs there an efficient way to use _lodash to delete
semirturgay

7
@ অ্যান্ডি আপনি ঠিকই বলেছেন, তবে যদি সূচকটি ইতিমধ্যে জানা না যায় তবে কী হবে?
thefourtheye 5:15

3
আপনি যদি নিজের অ্যারেটি পরিবর্তন করতে চান তবে স্প্লাইস () হ'ল সর্বোত্তম পন্থা। আপনি যদি অপসারণ ব্যবহার করেন তবে এটি নতুন অ্যারেটি ফেরত দেয় এবং এটি পুনরায় নিয়োগ দিতে হবে।
ওমরজেবাড়ী

আপনি যদি অ্যারে থেকে কোনও আইটেমকে তার সূচক দ্বারা সরিয়ে নিতে চান (অবশ্যই আপনি যদি এই পদ্ধতিতে অপসারণের ক্রিয়াটি সম্পাদন করতে চান তবে আপনার এই সূচকটি রয়েছে), তবে স্প্লাইস পদ্ধতিটি ব্যবহার করা সবচেয়ে কার্যকর (এবং সহজ) উপায় এটা করতে। কোনও কিছুর তুলনা করার জন্য এবং বাগগুলি এবং ত্রুটির জন্য
কোডটিকে

26

আপনি এটি দিয়ে করতে পারেন _pull

_.pull(obj["subTopics"] , {"subTopicId":2, "number":32});

রেফারেন্স পরীক্ষা করুন


7
ডক্স প্রতি, _.pullব্যবহার তুলনা জন্য কঠোর সমতা, অর্থাত === । দুটি পৃথক প্লেইন অবজেক্ট কখনই সমান ===(বা ==সেই বিষয়টির দ্বারা) হিসাবে তুলনা করবে না । সুতরাং উপরে আপনার কোড অ্যারে থেকে কোন উপাদান সরবে না।
মার্ক আমেরিকা

1
তবুও, এই একমাত্র অ্যারে স্ট্রিং সঙ্গে কাজ করে। _.removeশুধু অ্যারে flushes।
ইয়াউহেনী প্রকোপাচাইক

3
আমি এখনও মনে করি এটি সঠিক উত্তর। জেএস। ফিল্টার সমস্ত উপাদান মিলেছে এমনটি সরিয়ে দেয়, জেএস .স্প্লাইসের প্রয়োজন হয় যে আমি সূচকটি জানি, _আরেউ এর সমস্ত উপাদানগুলির উপর পুনরাবৃত্তি ঘটে যাতে কম দক্ষ হয়। _.পুল হ'ল আমি যা চাই: _.পুল (অ্যারে, আইটেম টো রিমোভ)।
এহুদা গ্যাব্রিয়েল হিমাঙ্গো

21

আপনি এখন _.reject ব্যবহার করতে পারেন যা আপনাকে যা রক্ষা করতে হবে তার পরিবর্তে আপনাকে যা রক্ষা করতে হবে তার ভিত্তিতে ফিল্টার করতে দেয়।

অসদৃশ _.pull বা _.removeএটি যে কেবল অ্যারেগুলিতে কাজ করে, যে কোনওটিতে ._rejectকাজ করে Collection

obj.subTopics = _.reject(obj.subTopics, (o) => {
  return o.number >= 32;
});

2

আমি জানি হিসাবে এটি করার জন্য চারটি উপায় রয়েছে

const array = [{id:1,name:'Jim'},{id:2,name:'Parker'}];
const toDelete = 1;

প্রথম:

_.reject(array, {id:toDelete})

দ্বিতীয়টি হ'ল:

_.remove(array, {id:toDelete})

এই ভাবে অ্যারেটি পরিবর্তন করা হবে।

তৃতীয়টি হ'ল:

_.differenceBy(array,[{id:toDelete}],'id')
// If you can get remove item 
// _.differenceWith(array,[removeItem])

শেষটি হ'ল:

_.filter(array,({id})=>id!==toDelete)

আমি শিখছি lodash

একটি রেকর্ড তৈরি করার উত্তর, যাতে আমি এটি পরে খুঁজে পেতে পারি।


আমি খুঁজছিলামreject
সাম্পগুন

2

উপরন্তু উত্তর @thefourtheye করতে ব্যবহার সম্পৃক্ত ঐতিহ্যগত বেনামী ফাংশন পরিবর্তে:

  _.remove(obj.subTopics, (currentObject) => {
        return currentObject.subTopicId === stToDelete;
    });

অথবা

obj.subTopics = _.filter(obj.subTopics, (currentObject) => {
    return currentObject.subTopicId !== stToDelete;
});


0

এখানে অ্যারে সহ সহজ লোডাশ ফাংশন এবং তা সূচক নম্বর দিয়ে মুছে ফেলা হচ্ছে।

index_tobe_delete = 1

fruit = [{a: "apple"}, {b: "banana"}, {c: "choco"}]
_.filter(fruit, (value, key)=> {
return (key !== index_tobe_delete)
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.