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


373

আমার কাছে একটি অবজেক্ট রয়েছে যার মধ্যে একটি অ্যারে রয়েছে।

things = new Object();

things.thing = new Array();

things.thing.push({place:"here",name:"stuff"});
things.thing.push({place:"there",name:"morestuff"});
things.thing.push({place:"there",name:"morestuff"});

আমি ভাবছি কোন অ্যারে থেকে সদৃশ বস্তুগুলি সরিয়ে ফেলার জন্য সেরা পদ্ধতিটি কী। সুতরাং উদাহরণস্বরূপ, জিনিস। কিছু হয়ে উঠবে ...

{place:"here",name:"stuff"},
{place:"there",name:"morestuff"}

আপনি কী বোঝাতে চেয়েছেন যে আপনি একই প্যারামিটারগুলিকে অ্যারেতে যুক্ত হ্যাশ টেবিল / অবজেক্টটি কীভাবে থামান?
ম্যাথু লক

1
ম্যাথিউ -> যদি কোনও সদৃশ বস্তুকে প্রথমে অ্যারেতে যুক্ত করা থেকে বিরত রাখা সহজ হয় তবে পরে এটি ছাঁকুন না করে, হ্যাঁ, এটিও ঠিক আছে।
ট্র্যাভিস

2
লোকেরা কীভাবে তাদের ভেরিয়েবলের নাম দেয় তা আমার অবাক করে দেয়। কখনও কখনও আমি মনে করি তারা সত্যিই এটিকে অযথা জটিল করতে চায়। দেখার পরের দিকে aaaaa.aaaa.push(...):)
ডাজিটো

উত্তর:


154

একটি আদিম পদ্ধতি হ'ল:

var obj = {};

for ( var i=0, len=things.thing.length; i < len; i++ )
    obj[things.thing[i]['place']] = things.thing[i];

things.thing = new Array();
for ( var key in obj )
    things.thing.push(obj[key]);

15
লুপের জন্য আপনাকে দৈর্ঘ্যটি কখনই ব্যবহার করা উচিত নয়, কারণ এটি প্রতিটি পুনরাবৃত্তিতে এটি গণনা করে ধীরে ধীরে কমিয়ে দেবে। এটিকে লুপের বাইরে কোনও ভেরিয়েবলের জন্য বরাদ্দ করুন এবং টেক্সট.থিংথের পরিবর্তে ভেরিয়েবলটি পাস করুন।
0v3rth3d4wn

12
@ এএফএক্সএক্সএক্স আমি এই ফাংশনটি পুরোপুরি বুঝতে পারি না, আপনি "পরিস্থিতি" একইরকম তবে নামটি আলাদা বলে কীভাবে পরিস্থিতি সামাল দেন?
কুয়ান

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

1
@ প্রদীপজিএম আপনি একদম ঠিক বলেছেন উত্তর কোনও প্রয়োজনীয় অর্ডার সংরক্ষণ করবে না (প্রয়োজনীয়ভাবে)। যদি এটির প্রয়োজন হয় তবে অন্যের সমাধানের সন্ধান করা উচিত।
এএফএক্সএক্স

এক্স এবং ডি-ডুপড সহ এমন একটি অ্যারে থেকে অবজেক্টগুলি সরাতে আমি কীভাবে উপরেরটি সংশোধন করতে পারি?
রায়ান হলটন

435

কিছু es6জাদু নিয়ে কেমন আছে ?

things.thing = things.thing.filter((thing, index, self) =>
  index === self.findIndex((t) => (
    t.place === thing.place && t.name === thing.name
  ))
)

রেফারেন্স ইউআরএল

আরও জেনেরিক সমাধান হ'ল:

const uniqueArray = things.thing.filter((thing, index) => {
  const _thing = JSON.stringify(thing);
  return index === things.thing.findIndex(obj => {
    return JSON.stringify(obj) === _thing;
  });
});

স্ট্যাকব্লিটজ উদাহরণ


81
এটি সংক্ষিপ্ত করা যেতে পারে:things.thing = things.thing.filter((thing, index, self) => self.findIndex(t => t.place === thing.place && t.name === thing.name) === index)
জোশ কোল

পুরোপুরি কাজ করে! var অনন্যআরআওঅফবজেক্টস = অ্যারেঅফবজেক্টস.ফিল্টার (ফাংশন (অবজেক্ট, সূচক, স্ব) {রিটার্ন ইনডেক্স === সেলফ.ফাইন্ড ইন্ডেক্স (ফাংশন (টি) {রিটার্ন টি ['আপত্তি-সম্পত্তি'] === আপত্তি ['আপত্তি-সম্পত্তি']] });}); আপনি সঠিক জেএস সিনট্যাক্স ব্যবহার করেছেন তা নিশ্চিত করুন।
মোহাম্মদ সালেম লামিরি

সেগুলি যথাযথ জেএস সিনট্যাক্স। আপনার 1) ফ্যাট অ্যারো ফাংশন ব্যবহার করা হচ্ছে না 2) অন্তর্নিহিত রিটার্ন বা 3) ডট স্বরলিপি। আপনার ইএস 5 সিনট্যাক্স। অন্যান্যগুলি বেশিরভাগ ES6 (ইসিএমএ ২০১৫)। সবগুলি 2017 এ বৈধ।
agm1984

8
@vsync কেবল @ বিকেএম এর উত্তর নিন এবং এটি একসাথে রাখুন, একটি জেনেরিক সমাধান const uniqueArray = arrayOfObjects.filter((object,index) => index === arrayOfObjects.findIndex(obj => JSON.stringify(obj) === JSON.stringify(object))); হ'ল
এড্রিয়ান

9
এখানে মূল কীটি হ'ল ফাইন্ড ইন্ডেক্স () পদ্ধতিটি প্রথম উপাদানটির সূচক ফেরত দেয় , সুতরাং যদি কোনও দ্বিতীয় উপাদান মেলে তবে এটি ফিল্টার চলাকালীন কখনই খুঁজে পাওয়া যাবে না। আমি এক মিনিটের জন্য এটির দিকে তাকিয়ে ছিলাম :)
জেবাকজুক

111

আপনি যদি জাভাস্ক্রিপ্ট লাইব্রেরি যেমন আন্ডারস্কোর বা লড্যাশ ব্যবহার করতে পারেন তবে আমি _.uniqতাদের লাইব্রেরিতে ফাংশনটি একবার দেখার পরামর্শ দিই । থেকে lodash:

_.uniq(array, [isSorted=false], [callback=_.identity], [thisArg])

মূলত, আপনি অ্যারেতে পাস করেন যে এখানে একটি অবজেক্ট আক্ষরিক এবং আপনি সেই বৈশিষ্ট্যটিতে পাস করেছেন যা আপনি মূল ডাটা অ্যারেতে সদৃশগুলি মুছতে চান:

var data = [{'name': 'Amir', 'surname': 'Rahnama'}, {'name': 'Amir', 'surname': 'Stevens'}];
var non_duplidated_data = _.uniq(data, 'name'); 

আপডেট : লোড্যাশ এখন একটি চালু করেছে .uniqBy


3
@ প্রবীণ পিডিএস: আমি কোড উদাহরণে আন্ডারস্কোর সম্পর্কে কিছু বলেছিলাম? আমি বলেছিলাম যে 'লোডাশ'-এর এই ফাংশন রয়েছে এবং আন্ডারস্কোরটি একই রকম রয়েছে। ভোট দেওয়ার আগে, দয়া করে উত্তরগুলি মনোযোগ সহকারে পড়ুন।
আম্বোদি

// _undcore.js হোল্ডঅবজেক্ট = _.উনিক (হোল্ডঅবজেক্ট, ফাংশন (আইটেম, কী, নাম) item রিটার্ন আইটেম.নেম;}) ব্যবহার করে অনন্য অবজেক্টের তালিকা দেয়;
praveenpds

26
নোট: আপনি এখন ব্যবহার করতে হবে uniqByপরিবর্তে uniq, যেমন _.uniqBy(data, 'name'): ... ডকুমেন্টেশন lodash.com/docs#uniqBy
drmrbrewer

82

একমাত্র ক্ষেত্রের নকলের ভিত্তিতে একটি অ্যারেতে সদৃশ অবজেক্টগুলি সরাতে আমার এই একই একই প্রয়োজনীয়তা ছিল। আমি এখানে কোড পেয়েছি: জাভাস্ক্রিপ্ট: অবজেক্টের অ্যারে থেকে সদৃশগুলি সরান

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

var arrayWithDuplicates = [
    {"type":"LICENSE", "licenseNum": "12345", state:"NV"},
    {"type":"LICENSE", "licenseNum": "A7846", state:"CA"},
    {"type":"LICENSE", "licenseNum": "12345", state:"OR"},
    {"type":"LICENSE", "licenseNum": "10849", state:"CA"},
    {"type":"LICENSE", "licenseNum": "B7037", state:"WA"},
    {"type":"LICENSE", "licenseNum": "12345", state:"NM"}
];

function removeDuplicates(originalArray, prop) {
     var newArray = [];
     var lookupObject  = {};

     for(var i in originalArray) {
        lookupObject[originalArray[i][prop]] = originalArray[i];
     }

     for(i in lookupObject) {
         newArray.push(lookupObject[i]);
     }
      return newArray;
 }

var uniqueArray = removeDuplicates(arrayWithDuplicates, "licenseNum");
console.log("uniqueArray is: " + JSON.stringify(uniqueArray));

ফলাফলগুলো:

অনন্যআররে হল:

[{"type":"LICENSE","licenseNum":"10849","state":"CA"},
{"type":"LICENSE","licenseNum":"12345","state":"NM"},
{"type":"LICENSE","licenseNum":"A7846","state":"CA"},
{"type":"LICENSE","licenseNum":"B7037","state":"WA"}]

1
এটি আরও কার্যকর হবে যদি ফাংশনটি 'মিথ্যাবাদী' অবজেক্টগুলিকেও ফিল্টার করতে পারে। for(var i in array) { if(array[i][prop]){ //valid lookupObject[array[i][prop]] = array[i]; } else { console.log('falsy object'); } }
আব্দুল সাদিক ইয়ালসিন

জটিলতা 0 (এন) ব্যবহার করে কেন নামিয়ে আনবেন না: for (let i in originalArray) { if (lookupObject[originalArray[i]['id']] === undefined) { newArray.push(originalArray[i]); } lookupObject[originalArray[i]['id']] = originalArray[i]; }
টিউডর বি

এটি সেরা উপায় কারণ এটি কী তা আপনি নকল হতে চান না তা জানা গুরুত্বপূর্ণ। এখন এটি কি E6 স্ট্যান্ডার্ডের জন্য হ্রাসকারকের মাধ্যমে করা যেতে পারে?
খ্রিস্টান ম্যাথিউ

69

ES6 + এর জন্য সংক্ষিপ্ততম একটি লাইনার

idএকটি অ্যারেতে অনন্য সন্ধান করুন ।

arr.filter((v,i,a)=>a.findIndex(t=>(t.id === v.id))===i)

একাধিক বৈশিষ্ট্য ( placeএবং name) দ্বারা স্বতন্ত্র

arr.filter((v,i,a)=>a.findIndex(t=>(t.place === v.place && t.name===v.name))===i)

সমস্ত বৈশিষ্ট্যের দ্বারা স্বতন্ত্র (এটি বড় অ্যারেগুলির জন্য ধীর হবে)

arr.filter((v,i,a)=>a.findIndex(t=>(JSON.stringify(t) === JSON.stringify(v)))===i)

শেষ ঘটনাটি রাখুন।

arr.slice().reverse().filter((v,i,a)=>a.findIndex(t=>(t.id === v.id))===i).reverse()

2
যাদু, এটি আসল উত্তর
লুইস কনট্রেরাস

48

সেট ব্যবহার করে একটি লাইনার

var things = new Object();

things.thing = new Array();

things.thing.push({place:"here",name:"stuff"});
things.thing.push({place:"there",name:"morestuff"});
things.thing.push({place:"there",name:"morestuff"});

// assign things.thing to myData for brevity
var myData = things.thing;

things.thing = Array.from(new Set(myData.map(JSON.stringify))).map(JSON.parse);

console.log(things.thing)

ব্যাখ্যা:

  1. new Set(myData.map(JSON.stringify))স্ট্রিংযুক্ত মাইডাটা উপাদান ব্যবহার করে একটি সেট অবজেক্ট তৈরি করে।
  2. সেট অবজেক্টটি নিশ্চিত করবে যে প্রতিটি উপাদান অনন্য।
  3. তারপরে আমি অ্যারে.ফ্রোম ব্যবহার করে তৈরি করা সেটের উপাদানগুলির ভিত্তিতে একটি অ্যারে তৈরি করব।
  4. পরিশেষে, আমি স্ট্রিংযুক্ত উপাদানটিকে কোনও বস্তুতে ফিরে রূপান্তর করতে JSON.parse ব্যবহার করি।

18
সমস্যাটি হ'ল: a, 1: b: 2} সমান হবে না a বি: 2, এ: 1}
পাইরেটঅ্যাপ

2
মনে রাখবেন যে তারিখের বৈশিষ্ট্যগুলির সাথে কোনও সমস্যা হবে
মার্কোসায়ান আর্টুর

এই লাইনটি একটি সারির অবজেক্টের সাথে এলোমেলো নাল মান তৈরি করে যা বস্তুর মূল অ্যারেতে উপস্থিত নেই। আপনি কি সাহায্য করতে পারেন?
বি 1 কে

46

একক লাইনে ES6 + ব্যবহার করে আপনি কী দ্বারা অবজেক্টগুলির একটি অনন্য তালিকা পেতে পারেন:

const unique = [...new Map(arr.map(item => [item[key], item])).values()]

এটি একটি ফাংশনে রাখা যেতে পারে:

function getUniqueListBy(arr, key) {
    return [...new Map(arr.map(item => [item[key], item])).values()]
}

এখানে একটি কার্যকারী উদাহরণ:

const arr = [
    {place: "here",  name: "x", other: "other stuff1" },
    {place: "there", name: "x", other: "other stuff2" },
    {place: "here",  name: "y", other: "other stuff4" },
    {place: "here",  name: "z", other: "other stuff5" }
]

function getUniqueListBy(arr, key) {
    return [...new Map(arr.map(item => [item[key], item])).values()]
}

const arr1 = getUniqueListBy(arr, 'place')

console.log("Unique by place")
console.log(JSON.stringify(arr1))

console.log("\nUnique by name")
const arr2 = getUniqueListBy(arr, 'name')

console.log(JSON.stringify(arr2))

এটা কিভাবে কাজ করে

প্রথমে অ্যারেটি এমনভাবে রিম্যাপ করা হয় যাতে এটি কোনও মানচিত্রের ইনপুট হিসাবে ব্যবহার করা যায়

arr.map (আইটেম => [আইটেম [কী], আইটেম]);

যার অর্থ অ্যারের প্রতিটি আইটেম 2 টি উপাদান সহ অন্য অ্যারেতে রূপান্তরিত হবে; নির্বাচিত চাবি প্রথম উপাদান এবং সমগ্র প্রাথমিক আইটেমটি দ্বিতীয় উপাদান হিসেবে, এই একটি এন্ট্রি করে (ex। বলা হয় অ্যারের এন্ট্রি , মানচিত্র এন্ট্রি )। এবং এখানে ম্যাপ কনস্ট্রাক্টরে অ্যারে এন্ট্রিগুলি কীভাবে যুক্ত করবেন তা উদাহরণ সহ দাপ্তরিক ডক

উদাহরণ যখন চাবিকাঠি জায়গা :

[["here", {place: "here",  name: "x", other: "other stuff1" }], ...]

দ্বিতীয়ত, আমরা এই পরিবর্তিত অ্যারেটি মানচিত্রের কনস্ট্রাক্টরকে দিয়ে দিই এবং এখানে যাদুটি ঘটছে। মানচিত্রটি একই কীটির কেবল শেষ সন্নিবেশিত মান রেখে ডুপ্লিকেট কী মানগুলি মুছে ফেলবে। দ্রষ্টব্য : মানচিত্র সন্নিবেশয়ের ক্রমটি রাখে। ( মানচিত্র এবং অবজেক্টের মধ্যে পার্থক্য পরীক্ষা করুন )

নতুন মানচিত্র (এন্ট্রি অ্যারে ঠিক উপরে ম্যাপ করা হয়েছে)

তৃতীয় আমরা আসল আইটেমগুলি পুনরুদ্ধার করতে মানচিত্রের মানগুলি ব্যবহার করি তবে এবার নকল ছাড়াই।

নতুন মানচিত্র (ম্যাপডআরআর) মূল্যায়ন ()

এবং সর্বশেষ একটি হ'ল একটি নতুন অ্যারেতে এই মানগুলি যুক্ত করা যাতে এটি প্রাথমিক কাঠামো হিসাবে দেখায় এবং ফিরে আসতে পারে:

প্রত্যাবর্তন [... নতুন মানচিত্র (ম্যাপেডআর)। মূল্যবোধ ()]


এটি মূল প্রশ্নের উত্তর দেয় না কারণ এটি কোনওটির জন্য অনুসন্ধান করা হয় id। প্রশ্নটির পুরো ক্ষেত্রের মধ্যে যেমন অনন্য হওয়া দরকার placeএবং যেমনname
এল। হল্যান্ডা

আপনার ES6 ফাংশনটি খুব সংক্ষিপ্ত এবং বাস্তব বলে মনে হচ্ছে। আপনি কিছুটা আরও ব্যাখ্যা করতে পারেন? ঠিক কী হচ্ছে? প্রথম বা শেষ নকলগুলি সরানো হয়েছে? বা এটি এলোমেলো, কোন সদৃশ সরানো হয়? ধন্যবাদ, ধন্যবাদ।
ডেভিড শুমান

আমি যতদূর বলতে পারি, সম্পত্তি হিসাবে মান হিসাবে একটি মানচিত্র তৈরি করা হয়েছে। তবে অ্যারের ক্রমটি কীভাবে বা সংরক্ষণ করা যায় তা 100% নয়।
ডেভিড শুমন 18

1
হাই @ ডেভিডসচুমান, আমি উত্তরটি আপডেট করব এবং এটি কীভাবে কাজ করে তা ব্যাখ্যা করব। তবে সংক্ষিপ্ত উত্তরের জন্য আদেশটি সংরক্ষণ করা হয়েছে এবং প্রথমটি সরিয়ে দেওয়া হয়েছে ... মানচিত্রে এটি কীভাবে সন্নিবেশ করা হয়েছে সে সম্পর্কে কেবল চিন্তা করুন ... এটি কীটি ইতিমধ্যে উপস্থিত রয়েছে কিনা এটি এটি আপডেট করবে কিনা তা পরীক্ষা করে, অতএব শেষটিটি রয়ে যাবে
ভি । সাম্বার

30

অ্যারে পুনরাবৃত্তি পদ্ধতি ব্যবহার করে এটি করার জন্য এখানে আরও একটি বিকল্প রয়েছে যদি আপনার কোনও অবজেক্টের কেবলমাত্র একটি ক্ষেত্রের সাথে তুলনা প্রয়োজন:

    function uniq(a, param){
        return a.filter(function(item, pos, array){
            return array.map(function(mapItem){ return mapItem[param]; }).indexOf(item[param]) === pos;
        })
    }

    uniq(things.thing, 'place');

যদিও এর চেয়ে ও (এনও) এর চেয়ে বড় অর্ডার রয়েছে, এটি আমার ব্যবহারের ক্ষেত্রে ফিট করে কারণ আমার অ্যারের আকার সর্বদা 30 এরও কম হবে। ধন্যবাদ!
স্টেরেক্স

24

একটি লাইনার এখানে আছে

let arr = [
  {id:1,name:"sravan ganji"},
  {id:2,name:"anu"},
  {id:4,name:"mammu"},
  {id:3,name:"sanju"},
  {id:3,name:"ram"},
];

console.log(Object.values(arr.reduce((acc,cur)=>Object.assign(acc,{[cur.id]:cur}),{})))


1
আপনি যদি কেবলমাত্র একক সদৃশ মান সহ অবজেক্টগুলি সরাতে চান তবে ভাল এবং পরিষ্কার করুন, সম্পূর্ণরূপে সদৃশ বস্তুর জন্য পরিষ্কার নয়।
ডেভিড বার্কার

22

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

"সদৃশ নিষ্কাশন" ফাংশন সাধারণত বলা হয় অনন্য বা uniq । কিছু বিদ্যমান বাস্তবায়ন দুটি পদক্ষেপের সমন্বয় করতে পারে, উদাহরণস্বরূপ, প্রোটোটাইপের ইউনিক

আপনার গ্রন্থাগারের ইতিমধ্যে যদি না থাকে তবে এই পোস্টে কিছু চেষ্টা করার মত ধারণা রয়েছে (এবং কিছু এড়াতে :-)) রয়েছে ! ব্যক্তিগতভাবে আমি এটিকে সবচেয়ে সোজা এগিয়ে দেখি:

    function unique(a){
        a.sort();
        for(var i = 1; i < a.length; ){
            if(a[i-1] == a[i]){
                a.splice(i, 1);
            } else {
                i++;
            }
        }
        return a;
    }  

    // Provide your own comparison
    function unique(a, compareFunc){
        a.sort( compareFunc );
        for(var i = 1; i < a.length; ){
            if( compareFunc(a[i-1], a[i]) === 0){
                a.splice(i, 1);
            } else {
                i++;
            }
        }
        return a;
    }

এটি প্রাকৃতিক সাজানোর আদেশ ছাড়াই জেনেরিক বস্তুর পক্ষে কাজ করবে না।
টিম ডাউন

সত্য, আমি ব্যবহারকারীর সরবরাহিত তুলনা সংস্করণ যুক্ত করেছি।
ম্যাককাল্ট

আপনার ব্যবহারকারীর সরবরাহিত তুলনা সংস্করণটি কাজ করবে না কারণ যদি আপনার তুলনা ফাংশনটি থাকে function(_a,_b){return _a.a===_b.a && _a.b===_b.b;}তবে অ্যারে বাছাই করা হবে না।
গ্রাহাম.রিডস

1
এটি একটি অবৈধ তুলনা ফাংশন। বিকাশকারী.মোজিলা.আর্গ.এন থেকে / কোর_জবাস্ক্রিপ্ট_1.5_ রেফারেন্স / ... ... ফাংশন তুলনা করুন (ক, খ) {(যদি কিছু আদেশের মানদণ্ডে খ এর চেয়ে কম হয়) ফিরে আসে -১; যদি (অর্ডারিং মানদণ্ডের মাধ্যমে খ এর চেয়ে বড় হয়) 1 ফেরত দেয়; // এ বি বি 0 এর সমান হতে হবে; } ...
ম্যাককাল্ট

22

সহজ উপায়টি হ'ল filter:

var uniq = {}
var arr  = [{"id":"1"},{"id":"1"},{"id":"2"}]
var arrFiltered = arr.filter(obj => !uniq[obj.id] && (uniq[obj.id] = true));
console.log('arrFiltered', arrFiltered)


6
আপনার সমাধানটি কেন কাজ করা উচিত, বিশেষত অন্যান্য উত্তরগুলির চেয়ে আপনার কীভাবে ভাল is সে সম্পর্কে একটি ব্যাখ্যা যুক্ত করার জন্য স্ট্যাক ওভারফ্লোতে এটি ভাল অনুশীলন। আরও তথ্যের জন্য পড়ুন কিভাবে উত্তর দিতে হয়
স্যামুয়েল লিউ

এটি মূল প্রশ্নের উত্তর দেয় না কারণ এটি কোনওটির জন্য অনুসন্ধান করা হয় id। প্রশ্নটির পুরো ক্ষেত্রের মধ্যে যেমন অনন্য হওয়া দরকার placeএবং যেমনname
এল। হল্যান্ডা

16

এটি করার একটি সাধারণ উপায়: আপনি একটি ফাংশনে পাস করেন যা পরীক্ষা করে যে অ্যারের দুটি উপাদান সমান বিবেচিত হয় কিনা। এই ক্ষেত্রে, এটি দুটি বস্তুর তুলনা করা nameএবং তার placeবৈশিষ্ট্যের মানগুলির সাথে তুলনা করে ।

ES5 উত্তর

function removeDuplicates(arr, equals) {
    var originalArr = arr.slice(0);
    var i, len, val;
    arr.length = 0;

    for (i = 0, len = originalArr.length; i < len; ++i) {
        val = originalArr[i];
        if (!arr.some(function(item) { return equals(item, val); })) {
            arr.push(val);
        }
    }
}

function thingsEqual(thing1, thing2) {
    return thing1.place === thing2.place
        && thing1.name === thing2.name;
}

var things = [
  {place:"here",name:"stuff"},
  {place:"there",name:"morestuff"},
  {place:"there",name:"morestuff"}
];

removeDuplicates(things, thingsEqual);
console.log(things);

আসল ES3 উত্তর

function arrayContains(arr, val, equals) {
    var i = arr.length;
    while (i--) {
        if ( equals(arr[i], val) ) {
            return true;
        }
    }
    return false;
}

function removeDuplicates(arr, equals) {
    var originalArr = arr.slice(0);
    var i, len, j, val;
    arr.length = 0;

    for (i = 0, len = originalArr.length; i < len; ++i) {
        val = originalArr[i];
        if (!arrayContains(arr, val, equals)) {
            arr.push(val);
        }
    }
}

function thingsEqual(thing1, thing2) {
    return thing1.place === thing2.place
        && thing1.name === thing2.name;
}

removeDuplicates(things.thing, thingsEqual);

1
দুটি বস্তু সমান মূল্যায়ন করবে না, এমনকি যদি তারা একই বৈশিষ্ট্য এবং মানগুলি ভাগ করে।
কেনেবেক

হ্যা আমি জানি. তবে যথাযথ বিষয়, আমি প্রশ্নটি সঠিকভাবে পড়তে ব্যর্থ হয়েছি: আমি এটি চিহ্নিত করিনি যে এটি আগাছা করার জন্য প্রয়োজনীয় বৈশিষ্ট্যযুক্ত জিনিস objects আমি আমার উত্তর সম্পাদনা করব।
টিম ডাউন

1
অ্যারে-কন্টেইনগুলির ভিতরে থাকার পরিবর্তে- অ্যারে.প্রোটোটাইপ ব্যবহার করুন..সামান্য পদ্ধতি অ্যারে সদস্যদের মধ্যে
কোনও

13

তালিকায় আরও একটি যুক্ত করতে। ES6 ব্যবহার করে এবং Array.reduceসাথে Array.find
এই উদাহরণে কোনও guidসম্পত্তির উপর ভিত্তি করে অবজেক্ট ফিল্টার করা ।

let filtered = array.reduce((accumulator, current) => {
  if (! accumulator.find(({guid}) => guid === current.guid)) {
    accumulator.push(current);
  }
  return accumulator;
}, []);

কোনও সম্পত্তি বাছাইয়ের অনুমতি দেওয়ার জন্য এটি একটিকে প্রসারিত করা এবং এটি একটি লাইনারে সংকুচিত করা:

const uniqify = (array, key) => array.reduce((prev, curr) => prev.find(a => a[key] === curr[key]) ? prev : prev.push(curr) && prev, []);

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

const result = uniqify(myArrayOfObjects, 'guid')

11

আপনি এটি ব্যবহার করতে পারেন Map:

const dedupThings = Array.from(things.thing.reduce((m, t) => m.set(t.place, t), new Map()).values());

সম্পূর্ণ নমুনা:

const things = new Object();

things.thing = new Array();

things.thing.push({place:"here",name:"stuff"});
things.thing.push({place:"there",name:"morestuff"});
things.thing.push({place:"there",name:"morestuff"});

const dedupThings = Array.from(things.thing.reduce((m, t) => m.set(t.place, t), new Map()).values());

console.log(JSON.stringify(dedupThings, null, 4));

ফলাফল:

[
    {
        "place": "here",
        "name": "stuff"
    },
    {
        "place": "there",
        "name": "morestuff"
    }
]

+1, ডিডুপের অভ্যন্তরীণ কাজটি আরও কিছুটা ব্যাখ্যা করে বলার মতো সুন্দর হবে - উজ্জ্বল পক্ষে আমি এখন বুঝতে পারি হ্রাস কম: ডি
মিমিএএম

11

ডাং, বাচ্চারা, আসুন আমরা এই জিনিসটিকে নষ্ট করব, আমরা কেন করি না?

let uniqIds = {}, source = [{id:'a'},{id:'b'},{id:'c'},{id:'b'},{id:'a'},{id:'d'}];
let filtered = source.filter(obj => !uniqIds[obj.id] && (uniqIds[obj.id] = true));
console.log(filtered);
// EXPECTED: [{id:'a'},{id:'b'},{id:'c'},{id:'d'}];


এটি মূল প্রশ্নের উত্তর দেয় না কারণ এটি কোনওটির জন্য অনুসন্ধান করা হয় id। প্রশ্নটির পুরো ক্ষেত্রের মধ্যে যেমন অনন্য হওয়া দরকার placeএবং যেমনname
এল। হল্যান্ডা

এটি সমস্যার উপরোক্ত সাধারণীকরণের সংশোধন। আসল প্রশ্নটি 9 বছর আগে পোস্ট করা হয়েছিল, তাই মূল পোস্টারটি সম্ভবত আজ placeএবং nameআজ নিয়ে চিন্তিত নয় । এই থ্রেডটি পড়ছেন যে কেউ অবজেক্টের একটি তালিকা কেটে নেওয়ার জন্য একটি সর্বোত্তম উপায়ের সন্ধান করছেন এবং এটি এটি করার একটি কমপ্যাক্ট উপায়।
ক্লিফ হল

11

একটি টাইপস্ক্রিপ্ট সমাধান

এটি সদৃশ বস্তুগুলি সরিয়ে ফেলবে এবং বস্তুর প্রকারগুলিও সংরক্ষণ করবে।

function removeDuplicateObjects(array: any[]) {
  return [...new Set(array.map(s => JSON.stringify(s)))]
    .map(s => JSON.parse(s));
}

2
এটি দুর্দান্ত এবং সংক্ষিপ্ত!
mojjj

এবং খুব ধীর গতিতে ...
এল.হোল্যান্ডা

7

বিবেচনা করা lodash.uniqWith

var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];

_.uniqWith(objects, _.isEqual);
// => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]

পারফেক্ট! আপনাকে ;-)
ডনফ্যাবিওলাস

1
লোডাসের ইউনিক বা ইউনিক কেউই কৌশলটি করেনি, তবে আপনার সমাধানটি করেছে। ধন্যবাদ! দয়া করে আপনার কোডের উত্সটি দিন তবে এটি সরাসরি কপি। লডাশ.com
মনু সিজে

5

অন্য বিকল্পটি হ'ল একটি কাস্টম ইনডেক্স অফ ফাংশন তৈরি করা হবে, যা প্রতিটি বস্তুর জন্য আপনার নির্বাচিত সম্পত্তির মানগুলির সাথে তুলনা করে এবং এটি একটি হ্রাস ফাংশনটিতে মোড়ানো।

var uniq = redundant_array.reduce(function(a,b){
      function indexOfProperty (a, b){
          for (var i=0;i<a.length;i++){
              if(a[i].property == b.property){
                   return i;
               }
          }
         return -1;
      }

      if (indexOfProperty(a,b) < 0 ) a.push(b);
        return a;
    },[]);

এটি আমার জন্য দুর্দান্ত কাজ করেছে - আমি এটিকে lodash.isequalএনপিএম প্যাকেজের সাথে একটি হালকা ওজনের অবজেক্ট তুলক হিসাবে অনন্য অ্যারে ফিল্টারিং ... উদাহরণস্বরূপ বস্তুর স্বতন্ত্র অ্যারে তৈরি করেছি। শুধু আনা if (_.isEqual(a[i], b)) {খুঁজছেন @ একটি একক সম্পত্তি পরিবর্তে
MSFT - SliverNinja

5

let myData = [{place:"here",name:"stuff"}, 
 {place:"there",name:"morestuff"},
 {place:"there",name:"morestuff"}];


let q = [...new Map(myData.map(obj => [JSON.stringify(obj), obj])).values()];

console.log(q)

ES6 এবং ওয়ান-লাইনার ব্যবহার করে new Map()

// assign things.thing to myData
let myData = things.thing;

[...new Map(myData.map(obj => [JSON.stringify(obj), obj])).values()];

বিবরণ: -

  1. এরকম .map()তথ্য তালিকা এবং একটি মধ্যে প্রতিটি বস্তুর রূপান্তর [key, value]যুগল অ্যারে (দৈর্ঘ্য = 2), প্রথম উপাদান (চাবি) হবে stringifiedবস্তুর সংস্করণ এবং দ্বিতীয় (মান) একটি হবে objectনিজেই।
  2. উপরে তৈরি অ্যারে তালিকাকে যুক্ত new Map()হিসাবে কী হিসাবে যুক্ত করা হবে stringifiedএবং কোনও একই কী সংযোজন ইতিমধ্যে বিদ্যমান কীটিকে ওভাররাইড করে।
  3. ব্যবহার করে .values()মানচিত্রের মানচিত্রের সমস্ত মান সহ মানচিত্রের ব্যবস্থা করা হবে ( objআমাদের ক্ষেত্রে)
  4. পরিশেষে, spread ...উপরের পদক্ষেপটি থেকে মান সহ নতুন অ্যারে দেওয়ার জন্য অপারেটর।

4

এখানে এস 6 এর সমাধান রয়েছে যেখানে আপনি কেবল সর্বশেষ আইটেমটি রাখতে চান। এই সমাধানটি কার্যকরী এবং এয়ারবিএনবি শৈলী অনুসারে।

const things = {
  thing: [
    { place: 'here', name: 'stuff' },
    { place: 'there', name: 'morestuff1' },
    { place: 'there', name: 'morestuff2' }, 
  ],
};

const removeDuplicates = (array, key) => {
  return array.reduce((arr, item) => {
    const removed = arr.filter(i => i[key] !== item[key]);
    return [...removed, item];
  }, []);
};

console.log(removeDuplicates(things.thing, 'place'));
// > [{ place: 'here', name: 'stuff' }, { place: 'there', name: 'morestuff2' }]

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

4

সরানডুপ্লিকেট () বস্তুর একটি অ্যারে নেয় এবং কোনও সদৃশ অবজেক্ট (আইডি সম্পত্তির উপর ভিত্তি করে) ছাড়াই একটি নতুন অ্যারে প্রদান করে।

const allTests = [
  {name: 'Test1', id: '1'}, 
  {name: 'Test3', id: '3'},
  {name: 'Test2', id: '2'},
  {name: 'Test2', id: '2'},
  {name: 'Test3', id: '3'}
];

function removeDuplicates(array) {
  let uniq = {};
  return array.filter(obj => !uniq[obj.id] && (uniq[obj.id] = true))
}

removeDuplicates(allTests);

প্রত্যাশিত ফলাফল:

[
  {name: 'Test1', id: '1'}, 
  {name: 'Test3', id: '3'},
  {name: 'Test2', id: '2'}
];

প্রথমত, আমরা ভেরিয়েবল ইউনিকের মান একটি খালি বস্তুতে সেট করি।

এরপরে, আমরা বস্তুর অ্যারে দিয়ে ফিল্টার করব ফিল্টার সমস্ত উপাদানগুলির সাথে একটি নতুন অ্যারে তৈরি করে যা সরবরাহিত ফাংশন দ্বারা প্রয়োগ করা পরীক্ষায় উত্তীর্ণ হয়।

return array.filter(obj => !uniq[obj.id] && (uniq[obj.id] = true));

উপরে, আমরা && এর শর্ট সার্কিট কার্যকারিতা ব্যবহার করি। যদি && এর বাম দিকটি সত্য হিসাবে মূল্যায়ন করে তবে এটি && এর ডানদিকে মানটি দেয়। যদি বাম দিকটি মিথ্যা হয় তবে এটি && এর বাম দিকে যা আছে তা ফিরিয়ে দেয়।

প্রতিটি বস্তুর (অবজেক্ট) জন্য আমরা অজেক্ট.আইডির মান হিসাবে চিহ্নিত একটি সম্পত্তিটির জন্য ইউনিক পরীক্ষা করে দেখি (এই ক্ষেত্রে, প্রথম পুনরাবৃত্তিতে এটি সম্পত্তি '1' যাচাই করবে)) আমরা এটির ফিরে আসার বিপরীতে চাই (হয় সত্য বা মিথ্যা) যে কারণে আমরা ব্যবহার করি! ইন! ইউনিক [আপত্তি.আইডি]। যদি ইউনিকের আইডি সম্পত্তিটি ইতিমধ্যে থাকে তবে এটি সত্য ফেরায় যা মিথ্যা (!) এর মূল্যায়ন করে ফিল্টার ফাংশনটিকে সেই আপত্তিটি যুক্ত না করার জন্য বলে। তবে, যদি এটি আপজেড.আইডি সম্পত্তিটি না খুঁজে পায় তবে এটি মিথ্যা ফিরিয়ে দেয় যা তারপরে সত্য (!) এর কাছে মূল্যায়ন করে এবং সবকিছুকে &&, বা (ইউনিক [আপত্তি.আইডি] = সত্য) এর ডানদিকে ফিরিয়ে দেয়। এটি একটি সত্যবাদী মান, যা পরিশোধক অ্যারেতে এই আপত্তি যুক্ত করতে ফিল্টার পদ্ধতিটি বলছে এবং এটি ইউনিকের সাথে {1: সত্য} বৈশিষ্ট্যটি যুক্ত করে। এটি নিশ্চিত করে যে একই আইডি সহ অন্য কোনও আপত্তি উদাহরণ পুনরায় যুক্ত করা হবে না।


সম্ভবত আপনার কোডটি ব্যাখ্যা করুন, এবং এটি কীভাবে প্রশ্নের উত্তর দেয়?
মিশ্র

ধন্যবাদ, মিক্স 3 ডি। আমি স্পষ্টতা যোগ করেছি।
মার্কএন

এটি ব্যাখ্যা করার জন্য ধন্যবাদ! এই সমাধানটি আমার পক্ষে কাজ করে এবং এখানে পোস্ট হওয়া অন্য কয়েকজনের মতোই, যদিও আমি বুঝতে পারছিলাম না কি হচ্ছে :)
টিম মলয়

3
let data = [
  {
    'name': 'Amir',
    'surname': 'Rahnama'
  }, 
  {
    'name': 'Amir',
    'surname': 'Stevens'
  }
];
let non_duplicated_data = _.uniqBy(data, 'name');

9
আপনার কোডের চারপাশে একটি ব্যাখ্যা যুক্ত করুন যাতে ভবিষ্যতের দর্শকরা বুঝতে পারে যে এটি আপনি কী করছেন। ধন্যবাদ।
কুগস

আপনার উত্তরটি একটি বাহ্যিক কোড লাইব্রেরির উপর নির্ভরশীল ...
টেলর এ। লেচ

3

আমি বিশ্বাস করি সংমিশ্রণ reduceসঙ্গে JSON.stringifyথেকে পুরোপুরি তুলনা অবজেক্টস এবং বেছে বেছে যারা ইতিমধ্যেই সঁচায়ক নেই যোগ করার সময় একটি মার্জিত উপায়।

মনে রাখবেন যে JSON.stringifyচূড়ান্ত ক্ষেত্রে যেখানে অ্যারেতে অনেকগুলি অবজেক্ট রয়েছে এবং এটি জটিল, সম্ভবত বেশিরভাগ ক্ষেত্রেই এটি আইএমএইচও যাওয়ার সবচেয়ে সংক্ষিপ্ততম পদ্ধতিতে পারফরম্যান্সের সমস্যা হয়ে উঠতে পারে ।

var collection= [{a:1},{a:2},{a:1},{a:3}]

var filtered = collection.reduce((filtered, item) => {
  if( !filtered.some(filteredItem => JSON.stringify(filteredItem) == JSON.stringify(item)) )
    filtered.push(item)
  return filtered
}, [])

console.log(filtered)

একই লেখার আর একটি উপায় (তবে কম দক্ষ):

collection.reduce((filtered, item) => 
  filtered.some(filteredItem => 
    JSON.stringify(filteredItem ) == JSON.stringify(item)) 
      ? filtered
      : [...filtered, item]
, [])

যে আমার জন্য কাজ করে! ধন্যবাদ!
javascript110899

2

সেটিং: বস্তুর অ্যারে থেকে সদৃশ সরানোর ES6 উপায়ে অন্বেষণ অব্যাহত thisArgআর্গুমেন্ট Array.prototype.filterকরার new Setএকটি শালীন বিকল্প প্রদান করে:

const things = [
  {place:"here",name:"stuff"},
  {place:"there",name:"morestuff"},
  {place:"there",name:"morestuff"}
];

const filtered = things.filter(function({place, name}) {

  const key =`${place}${name}`;

  return !this.has(key) && this.add(key);

}, new Set);

console.log(filtered);

যাইহোক, এটি তীর ফাংশনগুলির সাথে কাজ করবে না () =>, যেমন thisতাদের লেক্সিকাল স্কোপের সাথে আবদ্ধ।


2

এক লাইনে এস magic ম্যাজিক ... এতে পাঠযোগ্য!

// returns the union of two arrays where duplicate objects with the same 'prop' are removed
const removeDuplicatesWith = (a, b, prop) => a.filter(x => !b.find(y => x[prop] === y[prop]);

2

ES6 এর সহজ সমাধান 'হ্রাস' এবং 'সন্ধান করুন' অ্যারে সহায়ক পদ্ধতিগুলি

দক্ষতা এবং পুরোপুরি সূক্ষ্ম কাজ করে!

"use strict";

var things = new Object();
things.thing = new Array();
things.thing.push({
    place: "here",
    name: "stuff"
});
things.thing.push({
    place: "there",
    name: "morestuff"
});
things.thing.push({
    place: "there",
    name: "morestuff"
});

// the logic is here

function removeDup(something) {
    return something.thing.reduce(function (prev, ele) {
        var found = prev.find(function (fele) {
            return ele.place === fele.place && ele.name === fele.name;
        });
        if (!found) {
            prev.push(ele);
        }
        return prev;
    }, []);
}
console.log(removeDup(things));

এটি আমাকে অনেক সাহায্য করেছে, আপনাকে ধন্যবাদ
jpisty

1

আপনি যদি পরে আপনার অনন্য অ্যারে বাছাই করে মনে না করেন তবে এটি একটি কার্যকর সমাধান হবে:

things.thing
  .sort(((a, b) => a.place < b.place)
  .filter((current, index, array) =>
    index === 0 || current.place !== array[index - 1].place)

এইভাবে, আপনাকে কেবল অ্যারের মধ্যে পূর্ববর্তী উপাদানটির সাথে বর্তমান উপাদানটির তুলনা করতে হবে। ফিল্টারিংয়ের আগে একবার বাছাই করা O(n*log(n))প্রতিটি অ্যারে উপাদান ( O(n²)) এর জন্য পুরো অ্যারেতে সদৃশ অনুসন্ধান করার চেয়ে সস্তা ।


1

অবজেক্টের অ্যারে থেকে সদৃশতা কীভাবে সরানো যায় এটি সহজ উপায়।

আমি ডেটা নিয়ে অনেক কাজ করি এবং এটি আমার পক্ষে কার্যকর।

const data = [{name: 'AAA'}, {name: 'AAA'}, {name: 'BBB'}, {name: 'AAA'}];
function removeDuplicity(datas){
    return datas.filter((item, index,arr)=>{
    const c = arr.map(item=> item.name);
    return  index === c.indexOf(item.name)
  })
}

console.log(removeDuplicity(data))

কনসোলে মুদ্রণ করবে:

[[object Object] {
name: "AAA"
}, [object Object] {
name: "BBB"
}]

এই সমাধানটি স্ট্যাটিক অ্যারে থেকে সদৃশতা অপসারণের জন্য ডিজাইন করা হয়েছে, তবে আপনি যখন ব্যাকএন্ড থেকে ডেটা অ্যারেতে ডেটা ঠেকেন তখন প্রতিস্থাপনটি ব্যবহার করার বিষয়টি বিবেচনা করুন। কারণ এক্ষেত্রে ডেটা অ্যারেতে ধাক্কা দেওয়া নতুন মানটি সরানো হবে এবং "পুরাতন" মানটি তথ্যের অ্যারেতে সঞ্চিত থাকবে।
Juraj

1
str =[
{"item_id":1},
{"item_id":2},
{"item_id":2}
]

obj =[]
for (x in str){
    if(check(str[x].item_id)){
        obj.push(str[x])
    }   
}
function check(id){
    flag=0
    for (y in obj){
        if(obj[y].item_id === id){
            flag =1
        }
    }
    if(flag ==0) return true
    else return false

}
console.log(obj)

str একটি অবজেক্টের অ্যারে। একই মানযুক্ত বস্তু রয়েছে (এখানে একটি ছোট উদাহরণ, দুটি আইটেম_আইড 2 হিসাবে দুটি বস্তু রয়েছে)। চেক (আইডি) এমন একটি ফাংশন যা যা একই আইটেম_আইডযুক্ত কোনও বস্তু উপস্থিত রয়েছে কিনা তা যাচাই করে। এটি উপস্থিত থাকলে মিথ্যা প্রত্যাবর্তন অন্যথায় সত্য হয়। ফলাফল অনুসারে, বস্তুকে নতুন অ্যারে আপজে চাপুন উপরের কোডটির আউটপুট [{"item_id":1},{"item_id":2}]


কিছু বর্ণনা যুক্ত করুন
ম্যাথিউস সানি

@ বিল্লা ঠিক আছে?
বিবিন জাইমন

1

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

এটির মতো অ্যারে তৈরি করার বিষয়টি বিবেচনা করুন

things.thing.push({place:"utopia",name:"unicorn"});
things.thing.push({place:"jade_palace",name:"po"});
things.thing.push({place:"jade_palace",name:"tigress"});
things.thing.push({place:"utopia",name:"flying_reindeer"});
things.thing.push({place:"panda_village",name:"po"});

মনে রাখবেন যে আপনি যদি একটি বৈশিষ্ট্য অনন্য রাখতে চান তবে আপনি খুব ভাল লডাশ লাইব্রেরি ব্যবহার করে এটি করতে পারেন। এখানে, আপনি _.uniqBy ব্যবহার করতে পারেন

.uniqBy (অ্যারে, [পুনরাবৃত্তি =। ভবিষ্যৎ])

এই পদ্ধতিটি _ ইউনকের মতো (যা একটি অ্যারের ডুপ্লিকেট-মুক্ত সংস্করণ প্রদান করে, যার মধ্যে প্রতিটি উপাদানটির প্রথম প্রথম উপস্থিতি রাখা হয়) ব্যতিরেকে এটি পুনরাবৃত্তিকে গ্রহণ করে যা অ্যারেতে প্রতিটি উপাদানটির জন্য মানদণ্ড উত্পন্ন করার জন্য গৃহীত হয় স্বতন্ত্রতা গণনা করা হয়।

সুতরাং, উদাহরণস্বরূপ, আপনি যদি 'অ্যারেজ' এর অনন্য বৈশিষ্ট্যযুক্ত অ্যারেটি ফিরিয়ে দিতে চান

_.উনীকবি (জিনিস। কিছু, 'স্থান')

একইভাবে, আপনি যদি 'নাম' হিসাবে অনন্য বৈশিষ্ট্য চান

_.উনীকবি (জিনিস। কিছু, 'নাম')

আশাকরি এটা সাহায্য করবে.

চিয়ার্স!

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