অ্যান্ডস্কোরজেএস ব্যবহার করে অ্যারে থেকে একটি আইটেম সরান


137

বলুন আমার কাছে এই কোড আছে

var আরর = [{আইডি: 1, নাম: 'এ'}, {আইডি: 2, নাম: 'বি'}, {আইডি: 3, নাম: 'সি'}];

এবং আমি অ্যারে থেকে আইডি = 3 দিয়ে আইটেমটি সরাতে চাই। চিটচিটে না করে কি এই উপায় আছে? আন্ডারস্কোর ব্যবহার করে মাই কিছু বা এরকম কিছু?

ধন্যবাদ!


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

6
স্প্লিকিংয়ে কী দোষ হয়েছে?
Vidime বিদাস

আপনি আন্ডারস্কোরের রেফারেন্স চেক করেছেন?
Vidime বিদাস

কেবল সরল জাভাস্ক্রিপ্ট ব্যবহার করে, এটি বস্তুর সম্পত্তি দ্বারা অ্যারে থেকে অবজেক্টগুলি অপসারণের একটি নকল ।
ফেলিক্স ক্লিং

5
আন্ডারস্কোর.জেএস এর ট্যাগ রয়েছে বলে এটি নকল নয়
গারিস এম সুয়েরো

উত্তর:


279

কেবল সরল জাভাস্ক্রিপ্ট ব্যবহার করে, এটি ইতিমধ্যে উত্তর দেওয়া হয়েছে: বস্তুর সম্পত্তি দ্বারা অ্যারে থেকে অবজেক্টগুলি সরান

আন্ডারস্কোর.জেএস ব্যবহার করে আপনি এর .findWhereসাথে একত্রিত হতে পারেন .without:

var arr = [{
  id: 1,
  name: 'a'
}, {
  id: 2,
  name: 'b'
}, {
  id: 3,
  name: 'c'
}];

//substract third
arr = _.without(arr, _.findWhere(arr, {
  id: 3
}));
console.log(arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

যদিও, যেহেতু আপনি যে কোনও উপায়ে এই ক্ষেত্রে একটি নতুন অ্যারে তৈরি করছেন, আপনি কেবল ব্যবহার করতে পারেন _.filterবা নেটিভ Array.prototype.filterফাংশন (ঠিক যেমন অন্য প্রশ্নে দেখানো হয়েছে)। তারপরে আপনি এখানে একবারের মতো সম্ভাব্য দু'বার পরিবর্তে কেবল একবার অ্যারেতে পুনরাবৃত্তি করতে পারেন।

আপনি যদি স্থানে অ্যারে পরিবর্তন করতে চান তবে আপনাকে ব্যবহার করতে হবে .splice। এটি অন্য প্রশ্নের মধ্যেও দেখানো হয়েছে এবং অদ্বিতীয় এটির জন্য কোনও কার্যকর ফাংশন সরবরাহ করে না বলে মনে হচ্ছে।


1
হ্যাঁ এটি পুরোপুরি কাজ করে, আমি আন্ডারস্কোর ডকুমেন্টেশনটি পেরিয়ে গিয়েছিলাম তবে কীভাবে এটি ছাড়া এটিকে টানা যায় তা বেশ বুঝতে পারি নি। ধন্যবাদ!
23-25 ​​এ ক্লাইম্বয়েড

10
_.রেজেক্ট বা _.ফিল্টার () এখানে অনেক বেশি দক্ষ হবে না? আপনি কেবলমাত্র একটি আইটেম টানতে তালিকার দুটি পুনরাবৃত্তি সহ শেষ করতে চাইবেন।
রিক স্ট্রহল

1
এটি একটি সদৃশ হতে পারে তবে এটি আরও ভাল উত্তর।
মাইকেল জে। ক্যালকিনস

2
আপনি কি ঠিক বলেছেন _.rejectএখানে আরও ভাল নির্বাচনের মতো দেখাচ্ছে।
তারিক

1
শেষ উপাদানটি পপ করতে @ লুকাসেরাত, ব্যবহার করুন arr.pop()...
এমিল বার্গারন

96

আপনি অ্যান্ডস্কোর ব্যবহার করতে পারেন .filter

    var arr = [{
      id: 1,
      name: 'a'
    }, {
      id: 2,
      name: 'b'
    }, {
      id: 3,
      name: 'c'
    }];

    var filtered = _(arr).filter(function(item) {
         return item.id !== 3
    });

এই হিসাবে লেখা যেতে পারে:

var filtered = arr.filter(function(item) {
    return item.id !== 3
});

var filtered = _.filter(arr, function(item) {
    return item.id !== 3
});

ফ্রেড চেক করুন

আপনি ব্যবহার করতে পারেন .reject


আমার মনে হয় আপনি বোঝাতে চেয়েছিলেন: var ফিল্টারড = _.ফিল্টার (আরআর, ফাংশন (আইটেম) {রিটার্ন আইটেম.আইডি! == 3});
tbh__

2
@tbh__ _()সংগ্রহটির চারপাশে একটি মোড়ক তৈরি করবে যা আপনাকে আন্ডারস্কোর পদ্ধতির সাহায্য করতে দেবে।
সুশান্ত -

আন্ডারস্কোরটি কয়েক বছর ধরে ব্যবহার করা হয়েছে, আমি এটি কখনই জানতাম না। ধন্যবাদ
tbh__


16

অ্যান্ডস্কোরটিতে অ্যারে থেকে কোনও আইটেম অপসারণ করার জন্য একটি _ ছাড়িয়ে () পদ্ধতি নিখুঁত রয়েছে, বিশেষত যদি আপনার কাছে অপসারণের অবজেক্ট থাকে।

মুছে ফেলা মানগুলির সমস্ত দৃষ্টান্ত সহ অ্যারের অনুলিপি দেয় Return

_.without(["bob", "sam", "fred"], "sam");

=> ["bob", "fred"]

আরও জটিল অবজেক্টের সাথে কাজ করে।

var bob = { Name: "Bob", Age: 35 };
var sam = { Name: "Sam", Age: 19 };
var fred = { Name: "Fred", Age: 50 };

var people = [bob, sam, fred]

_.without(people, sam);

=> [{ Name: "Bob", Age: 35 }, { Name: "Fred", Age: 50 }];

আপনার যদি আইটেমটি সরানোর মতো না করে থাকে তবে এটির কেবল একটি সম্পত্তি, আপনি ব্যবহার করতে পারেন _.findWhereএবং তারপরেও _.without


2
দ্রষ্টব্য: এটি কেবলমাত্র কাজ করে কারণ আপনি স্যাম অবজেক্টটি ছাড়াই পাস করছেন। পরিবর্তে { Name: "Sam", Age: 19 }ভেরিয়েবল স্যামের পরিবর্তে আপনি যদি পাস করেন তবে এটি আর কাজ করে না। ফিডল
আদম

5

আপনি যদি স্ট্রিং ফিল্টার করছেন এবং কেস সংবেদনশীল ফিল্টার খুঁজছেন দয়া করে যত্ন নিন exercise _. ছাড়া () কেস সংবেদনশীল। আপনি নীচে প্রদর্শিত হিসাবে _.reject () ব্যবহার করতে পারেন।

var arr = ["test","test1","test2"];

var filtered = _.filter(arr, function(arrItem) {
    return arrItem.toLowerCase() !== "TEST".toLowerCase();
});
console.log(filtered);
// ["test1", "test2"]

var filtered1 = _.without(arr,"TEST");
console.log(filtered1);
// ["test", "test1", "test2"]

var filtered2 = _.reject(arr, function(arrItem){ 
    return arrItem.toLowerCase() === "TEST".toLowerCase();
});
console.log(filtered2);
// ["test1", "test2"]

4

অন্যান্য উত্তরগুলি অ্যারেটির একটি নতুন অনুলিপি তৈরি করে, আপনি যদি অ্যারেটি ব্যবহার করতে পারেন এমন জায়গায় সংশোধন করতে চান:

arr.splice(_.findIndex(arr, { id: 3 }), 1);

তবে এটি ধরে নিয়েছে যে উপাদানটি সর্বদা অ্যারের অভ্যন্তরে খুঁজে পাওয়া যাবে (কারণ যদি এটি না পাওয়া যায় তবে এটি শেষ উপাদানটি সরিয়ে ফেলবে)। নিরাপদ থাকতে আপনি ব্যবহার করতে পারেন:

var index = _.findIndex(arr, { id: 3 });
if (index > -1) {
    arr.splice(index, 1);
}

2

বা অন্য সহজ উপায়:

_.omit(arr, _.findWhere(arr, {id: 3}));

আমার 2 সেন্ট


1
বাদ দেওয়া কাজ করে objectএবং একটি প্রদান করে object। অতএব Arraysযেখানে arrayকোনও উপাদান অপসারণের পরে আমরা ফিরে পাওয়ার আশা করতে পারি সেখানে কাজ করার জন্য ভাল হবেনা ।
স্ক্র্যাপকোড

1
সুতরাং, _ আপনি যা খুঁজছেন তা ছাড়া: _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4]
নাদিম

2

ব্যবহার করতে পারেন অতিরিক্ত প্লেইন জাভাস্ক্রিপ্ট এর Array#filterভালো পদ্ধতি:

var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

var filteredArr = arr.filter(obj => obj.id != 3);

console.log(filteredArr);

অথবা, ব্যবহার Array#reduceএবং এর Array#concatমতো পদ্ধতি:

var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

var reducedArr = arr.reduce((accumulator, currObj) => {
  return (currObj.id != 3) ? accumulator.concat(currObj) : accumulator;
}, []);

console.log(reducedArr);

বিঃদ্রঃ:

  • এই দুটিই খাঁটি কার্যকরী পদ্ধতির ( যেমন তারা বিদ্যমান অ্যারেটি সংশোধন করে না)।
  • না, এই পদ্ধতির জন্য বাহ্যিক গ্রন্থাগার প্রয়োজন (ভ্যানিলা জাভাস্ক্রিপ্ট যথেষ্ট)।

0

আমি এই পদ্ধতিতে চেষ্টা করতাম

_.filter(data, function(d) { return d.name != 'a' });

ব্যবহারকারীরা প্রদত্ত উপরের সমাধানগুলির মতো আরও ভাল পদ্ধতি থাকতে পারে


0

আন্ডারস্কোর.জেএস ব্যবহার করে

var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

var resultArr = _.reject(arr,{id:3});

console.log(resultArr);

ফলাফল হবে :: [{id:1name:'a'},{id:2,name:'c'}]


-1

আপনি অ্যান্ডস্কোরের প্রত্যাখ্যান পদ্ধতিটি ব্যবহার করতে পারেন, নীচে একটি নতুন অ্যারে প্রদান করবে যা নির্দিষ্ট মিলের সাথে অ্যারে থাকবে না

arr = _.reject(arr, function(objArr){ return objArr.id == 3; });
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.