একটি জাভাস্ক্রিপ্ট অ্যারেতে সমস্ত অনন্য মান পান (ডুপ্লিকেটগুলি সরান)


1481

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

সুতরাং আমাকে শিখতে সহায়তা করার জন্য, কেউ প্রোটোটাইপ স্ক্রিপ্টটি কোথায় ভুল হচ্ছে তা নির্ধারণ করতে আমাকে সহায়তা করতে পারে?

Array.prototype.getUnique = function() {
 var o = {}, a = [], i, e;
 for (i = 0; e = this[i]; i++) {o[e] = 1};
 for (e in o) {a.push (e)};
 return a;
}

সদৃশ প্রশ্ন থেকে আরও উত্তর:

অনুরূপ প্রশ্ন:


3
@ হিপ্পিটরেইল এই পুরানো প্রশ্নটি কেবল অনুলিপিগুলি সন্ধান এবং ফিরিয়ে আনার বিষয়ে (আমিও বিভ্রান্ত হয়ে পড়েছিলাম!)। আমার প্রশ্নটি যখন অ্যারেটিতে শূন্য থাকে তখন এই ফাংশনটি কেন ব্যর্থ হয় about
মট্টি

আপনি সম্ভবত আপনার প্রশ্নের শিরোনামটিও কম অস্পষ্ট করতে চান।
হিপ্পিট্রাইল

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

আমি কোডটি অন্য কোথাও থেকে অনুলিপি করেছিলাম, খুব দীর্ঘ সময় আগে ... তবে এটি বেশ সোজা-ফরোয়ার্ড বলে মনে হচ্ছে: o= object, a= array, i= indexএবং e=
উম্ম

উত্তর:


2655

সঙ্গে জাভাস্ক্রিপ্ট 1.6 / এর নাম ECMAScript 5 আপনি নেটিভ ব্যবহার করতে পারেন filterএকটি অ্যারের পদ্ধতি নিম্নলিখিত পদ্ধতিতে অনন্য মান সহ একটি বিন্যাস পেতে:

function onlyUnique(value, index, self) { 
    return self.indexOf(value) === index;
}

// usage example:
var a = ['a', 1, 'a', 2, '1'];
var unique = a.filter( onlyUnique ); // returns ['a', 1, 2, '1']

নেটিভ পদ্ধতিটি filterঅ্যারের মধ্য দিয়ে লুপ করবে এবং প্রদত্ত কলব্যাক ফাংশনটি পাসকারী কেবলমাত্র এন্ট্রিগুলিকেই ছেড়ে দেবে onlyUnique

onlyUniqueচেকস, যদি প্রদত্ত মানটি প্রথম হয়। যদি তা না হয় তবে এটি অবশ্যই একটি সদৃশ এবং অনুলিপি করা হবে না।

এই সমাধানটি jQuery বা প্রোটোটাইপ.জেএস এর মতো কোনও অতিরিক্ত লাইব্রেরি ছাড়াই কাজ করে।

এটি মিশ্র মান মানের সহ অ্যারেগুলির জন্যও কাজ করে।

পুরানো ব্রাউজারগুলির জন্য (<ie9), যা স্থানীয় পদ্ধতিগুলি সমর্থন করে না filterএবং indexOfআপনি MDN ডকুমেন্টেশনে ফিল্টার এবং সূচকের জন্য কাজ খুঁজে পেতে পারেন f

আপনি যদি কোনও মানটির সর্বশেষ ঘটনাটি রাখতে চান তবে সাধারণ indexOfদ্বারা প্রতিস্থাপন করুনlastIndexOf

ES6 এর সাহায্যে এটি সংক্ষিপ্ত করা যেতে পারে:

// usage example:
var myArray = ['a', 1, 'a', 2, '1'];
var unique = myArray.filter((v, i, a) => a.indexOf(v) === i); 

// unique is ['a', 1, 2, '1']

কামিলো মার্টিনকে ধন্যবাদমন্তব্যে ইঙ্গিত ।

ES6 এর Setঅনন্য মানগুলি সংরক্ষণ করার জন্য একটি নেটিভ অবজেক্ট রয়েছে । অনন্য মান সহ একটি অ্যারে পেতে আপনি এখন এটি করতে পারেন:

var myArray = ['a', 1, 'a', 2, '1'];

let unique = [...new Set(myArray)]; 

// unique is ['a', 1, 2, '1']

এর কনস্ট্রাক্টর Setঅ্যারের মতো একটি পুনরাবৃত্তিযোগ্য অবজেক্ট নেয় এবং স্প্রেড অপারেটর সেটটিকে আবার অ্যারে ...রূপান্তর করে। মন্তব্যে ইঙ্গিত দেওয়ার জন্য লুকাশ লিসকে ধন্যবাদ ।


53
দুর্ভাগ্যক্রমে এই সমাধানটি অনেক ধীর গতিতে চলবে। আপনি দুবার লুপিং করছেন, একবার ফিল্টার দিয়ে এবং একবার এর সূচী দিয়েছিলেন
জ্যাক ফ্রাঞ্জেন

18
নিবন্ধন করুন রাফেল থেকে সমাধান ? রাফেলস দ্রবণ মিশ্রিত ধরণের অ্যারেগুলির জন্য কাজ করে না। আমার উদাহরণের জন্য ['a', 1, 'a', 2, '1']আপনি পাবেন ['a', 1, 2]। তবে এটি আমার প্রত্যাশা নয়। বিটিডাব্লু, অনেক ধীর খুব আপেক্ষিক।
TLindig

25
আধুনিক জেএসে: .filter((v,i,a)=>a.indexOf(v)==i)(ফ্যাট অ্যার নোটেশন)।
ক্যামিলো মার্টিন


5
যেমন প্রথম বাছাই, এবং তথ্য ধরনের তারতম্য সঙ্গে তার আচরণ হিসাবে - - দেখুন অনেক সম্ভাবনার সহ অনেক বিস্তারিত উত্তর জন্য stackoverflow.com/a/9229821/368896
ড্যান Nissenbaum

873

ES6 / ES2015 জন্য আপডেট উত্তর : ব্যবহার সেট , একক লাইন সমাধান:

var items = [4,5,4,6,3,4,5,2,23,1,4,4,4]
var uniqueItems = Array.from(new Set(items))

যা ফিরে আসে

[4, 5, 6, 3, 2, 23, 1]

হিসাবে le_m প্রস্তাব, এটি ব্যবহার করে সংক্ষিপ্ত করা যেতে পারে বিস্তার অপারেটর , মত

var uniqueItems = [...new Set(items)]

10
লক্ষ্য করুন, সেই অভ্যন্তরীণ অ্যারেটি কাজ করবে নাArray.from(new Set([[1,2],[1,2],[1,2,3]]))
আলেকজান্ডার গনচারভ

2
এই সমাধানের তুলনায় পারফর্মেন্স myArray.filter((v, i, a) => a.indexOf(v) === i);কি?
সিমোইউ

42
দয়া করে মনে রাখবেন যদি আপনি ব্যবহার Setএবং অ্যাড আদিম মূল্যবোধের পরিবর্তে বস্তু এটি অনন্য থাকতে হবে রেফারেন্স বস্তু। এভাবে সেট sমধ্যে let s = new Set([{Foo:"Bar"}, {Foo:"Bar"}]);: এই ফিরে আসবে Set { { Foo: 'Bar' }, { Foo: 'Bar' } }যা হয় Setযে বস্তু একই মান ধারণ করার জন্য অনন্য বস্তু রেফারেন্স সঙ্গে। আপনি যদি লিখেন let o = {Foo:"Bar"};এবং তার পরে দুটি রেফারেন্স সহ একটি সেট তৈরি করেন : let s2 = new Set([o,o]);তবে Set { { Foo: 'Bar' } }
এস

2
এই বিকল্পগুলি দুজনেই এমনকি একটি polyfill.io স্তর হচ্ছে বর্তমান সঙ্গে IE10 উপর বিষয় আছে
Thymine

2
নতুন পরীক্ষা ক্ষেত্রে jsperf.com/array-filter-unique-vs-new-set/1 মত মনে হয় new Setএর ট্রফি
Shuk

167

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

আমি 4 টি সম্ভাব্য সমাধানের সমস্ত উত্তর বিভক্ত করেছি:

  1. নতুন ES6 বৈশিষ্ট্যটি ব্যবহার করুন: [...new Set( [1, 1, 2] )];
  2. { }সদৃশ প্রতিরোধ করতে অবজেক্ট ব্যবহার করুন
  3. সহায়ক অ্যারে ব্যবহার করুন [ ]
  4. ব্যবহার filter + indexOf

উত্তরে স্যাম্পল কোডগুলি এখানে পাওয়া গেল:

নতুন ES6 বৈশিষ্ট্যটি ব্যবহার করুন: [...new Set( [1, 1, 2] )];

function uniqueArray0(array) {
  var result = Array.from(new Set(array));
  return result    
}

{ }সদৃশ প্রতিরোধ করতে অবজেক্ট ব্যবহার করুন

function uniqueArray1( ar ) {
  var j = {};

  ar.forEach( function(v) {
    j[v+ '::' + typeof v] = v;
  });

  return Object.keys(j).map(function(v){
    return j[v];
  });
} 

সহায়ক অ্যারে ব্যবহার করুন [ ]

function uniqueArray2(arr) {
    var a = [];
    for (var i=0, l=arr.length; i<l; i++)
        if (a.indexOf(arr[i]) === -1 && arr[i] !== '')
            a.push(arr[i]);
    return a;
}

ব্যবহার filter + indexOf

function uniqueArray3(a) {
  function onlyUnique(value, index, self) { 
      return self.indexOf(value) === index;
  }

  // usage
  var unique = a.filter( onlyUnique ); // returns ['a', 1, 2, '1']

  return unique;
}

আর আমি ভাবলাম কোনটি দ্রুত। আমি গুগল শিট নমুনা তৈরি করেছিফাংশন পরীক্ষা করার জন্য । দ্রষ্টব্য: ইসিএমএ 6 গুগল শিটগুলিতে উপলভ্য নয়, তাই আমি এটি পরীক্ষা করতে পারি না।

পরীক্ষার ফলাফল এখানে: এখানে চিত্র বর্ণনা লিখুন

আমি প্রত্যাশা করেছি যে কোডটি ব্যবহার করে অবজেক্টটি { }জিতবে কারণ এটি হ্যাশ ব্যবহার করে। সুতরাং আমি আনন্দিত যে পরীক্ষাগুলি Chrome এবং IE এ এই অ্যালগরিদমের জন্য সেরা ফলাফল দেখিয়েছে showed জন্য ধন্যবাদ @rab করার কোড


"ফিল্টার + ইনডেক্সফ" বিকল্পটি 100.000 আইটেমের চেয়ে বেশি অ্যারেতে অত্যন্ত ধীর। আমাকে "অবজেক্ট ম্যাপ" এপ্রোচটি ব্যবহার করতে হয়েছিল তবে এটি আসল বাছাই করে।
স্বাধীনভাবে

উচ্চতর সংখ্যা কি ধীর, দ্রুত নয়?
fletchsod

3
@ ফ্লেচসড, নম্বরগুলি এমএসে কোড চালানোর সময়।
ম্যাক্স মাখরভ 20'19

1
সংখ্যাগুলি ওয়াং! গুগল অ্যাপস স্ক্রিপ্ট তাদের সার্ভারে চলে, ক্লায়েন্টের ব্রাউজারে নয় - এবং তাই Chrome / IE (বা কার্যত কোনও ব্রাউজার) এর পারফরম্যান্স একই হবে!
জে দধনিয়া

1
যদিও গুগল স্ক্রিপ্ট থেকে ক্লায়েন্ট-সাইড জেএস চালানো সম্ভব ( Google-script.host বা google.script.run এর মাধ্যমে - যা নিশ্চিত নয়), উত্তরে স্পষ্টভাবে বলা হয়েছে যে "ইসিএমএ 6 গুগল শিটগুলিতে উপলব্ধ নয়" - সুতরাং আমরা নিরাপদে ধরে নিতে পারি যে পোস্টারটি এর জন্য সার্ভার-সাইড গুগল স্ক্রিপ্ট ব্যবহার করেছে - এবং এইভাবে উত্তরটি ব্রাউজারের নয়, গুগল সার্ভারের কর্মক্ষমতা দেখায় !!
জে দধনিয়া

134

আপনি আন্ডারস্কোর.জেও ব্যবহার করতে পারেন ।

console.log(_.uniq([1, 2, 1, 3, 1, 4]));
<script src="http://underscorejs.org/underscore-min.js"></script>

যা ফিরে আসবে:

[1, 2, 3, 4]

22
অনুগ্রহ করে এই ভাবেন। অ্যারে প্রোটোটাইপ কিছু জ্যাক করবেন না। অনুগ্রহ.
জ্যাকব ডালটন

5
@ জ্যাকবডাল্টন - এটি অ্যারে প্রোটোটাইপটি বাড়িয়ে দিচ্ছে না। এটি _ অবজেক্টে নেমস্পিড।
সুপারলুমিনিয়র

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

20
@ জ্যাকবডাল্টন দয়া করে এটি করবেন না। কেবলমাত্র একটি ছোট কাজের জন্য অতিরিক্ত লাইব্রেরি যুক্ত করার দরকার নেইarray = [...new Set(array)]

3
এটি ইএস বৈশিষ্ট্যগুলি ব্যবহার করার এবং আরও বেশি গ্রন্থাগার যুক্ত করার উদ্দেশ্যটিকে পরাস্ত করে কেবল ওয়েবসাইটকে আরও বেশি করে ফুলে।
fletchsod

68

ওয়ান লাইনার, খাঁটি জাভাস্ক্রিপ্ট

ES6 সিনট্যাক্স সহ

list = list.filter((x, i, a) => a.indexOf(x) == i)

x --> item in array
i --> index of item
a --> array reference, (in this case "list")

এখানে চিত্র বর্ণনা লিখুন

ES5 সিনট্যাক্স সহ

list = list.filter(function (x, i, a) { 
    return a.indexOf(x) == i; 
});

ব্রাউজার সামঞ্জস্য : আই 9 +


13
@ স্পেটস এর চতুর্ভুজ ব্যয় হয়েছে, তাই এটি সেরা উত্তর নয়
ওরিওল

@ সমস্ত ধরণের মত বৈশিষ্ট্য / স্বাতন্ত্র্য ... হ্যাঁ, স্মার্ট হোন, প্রথমে বাছাই করতে রেডিক্স ব্যবহার করুন, বেশিরভাগ ক্ষেত্রে 0 (এন 2) এর চেয়ে দ্রুত গতিতে অনুসন্ধান করুন।
ডোকর

ধন্যবাদ বন্ধুরা! আমি প্রথমে কোডটির দিকে তাকালে এটি উপলব্ধি করতে পারি নি তবে এখন এটি আরও কিছুটা সুস্পষ্ট।
শুক্রবার

51

আমি তখন থেকে একটি দুর্দান্ত পদ্ধতি খুঁজে পেয়েছি যা jQuery ব্যবহার করে

arr = $.grep(arr, function(v, k){
    return $.inArray(v ,arr) === k;
});

দ্রষ্টব্য: এই কোডটি পল আইরিশের হাঁসের পাঞ্চিং পোস্ট থেকে টানা হয়েছিল - আমি ক্রেডিট দিতে ভুলে গেছি: পি


8
একটি সংক্ষিপ্ত সমাধান, তবে ইনআরিকে কল করা hasOwNProperty কল করার চেয়ে কম দক্ষ।
মিস্টার স্মিথ

এটিও ও (এন ^ 2), তাই না? যদিও অভিধান বা hasnwnProperty পদ্ধতির সম্ভবত ও (এন * লগএন) হবে।
স্পিড প্লেন

এটি আমার পক্ষে কাজ করেছে, ইন্টারনেট এক্সপ্লোরার হিসাবে অন্য সমস্ত সমাধান সমর্থিত নয়।
কর্ল

51

ES6 এর সাথে সংক্ষিপ্ততম সমাধান: [...new Set( [1, 1, 2] )];

অথবা আপনি যদি অ্যারে প্রোটোটাইপটি পরিবর্তন করতে চান (মূল প্রশ্নের মতো):

Array.prototype.getUnique = function() {
    return [...new Set( [this] )];
};

ইকামাস্ক্রিপ্ট এই মুহুর্তে (আগস্ট ২০১৫) আধুনিক ব্রাউজারগুলিতে আংশিকভাবে প্রয়োগ করা হয়েছে তবে বাবেল ES6 (এবং এমনকি ES7) ফিরে ES5 এ স্থানান্তর করার জন্য খুব জনপ্রিয় হয়ে উঠেছে। আপনি আজ ES6 কোড লিখতে পারেন!

এর ...অর্থ কী তা যদি আপনি ভাবছেন তবে এটিকে স্প্রেড অপারেটর বলেএমডিএন থেকে : spread স্প্রেড অপারেটর এমন এক জায়গায় অভিব্যক্তি প্রসারিত করতে দেয় যেখানে একাধিক যুক্তি (ফাংশন কলগুলির জন্য) বা একাধিক উপাদান (অ্যারে আক্ষরিক জন্য) প্রত্যাশিত » যেহেতু একটি সেট একটি পুনরাবৃত্তিযোগ্য (এবং কেবলমাত্র অনন্য মান থাকতে পারে), স্প্রেড অপারেটর অ্যারে পূরণের জন্য সেটটি প্রসারিত করবে।

ES6 শেখার জন্য সংস্থানসমূহ:


3
আপনি এটি আরও ছোট করেও করতে পারেন a = [...Set(a)], তবে যাইহোক, এটি আপাতত কেবল ফায়ারফক্স।
c69

@ c69, ঠিক আছে, এর চেয়ে কম হবে না। স্পাইডারমনকি ব্যবহারকারীরাও প্রশংসা করবে।
টর্স্টেন বেকার

বাবেলের সাথে কাজ করে। আপনাকে কেবল অ্যারে.ফর্ম থেকে শিমও অন্তর্ভুক্ত করতে হবে:require ( "core-js/fn/array/from" );
ভ্লাদিস্লাভ রাস্ট্রুসনি

এটি অ্যারে.প্রোটোটাইপ.গেট ইউনিক = ফাংশন () {রিটার্ন [... নতুন সেট ([এটি])] হওয়া উচিত; }; বা, অ্যারে.প্রোটোটাইপ.গেট ইউনিক = ফাংশন () {রিটার্ন [... নতুন সেট (এটি)]; }; আমি এটি নিম্নলিখিতটি প্রয়োগ করেছি - body ('বডি') h এইচটিএমএল () to । _-] \ [zA-Z0-9 ._-]) / GI) .getUnique (); প্রথমটি আমাকে কেবল তখনই একটি অনন্য মূল্য দেয় যেখানে দ্বিতীয়টি সমস্ত নকল মুছে ফেলার জন্য পুনরায় ফিরিয়ে দেয়।
ashique

[...Set(['a', 1, 'a', 2, '1'])]একটি টাইপরর ফেলে দেবে, সুতরাং এটি ধরে রাখা এখনও বুদ্ধিমান new:[...new Set(['a', 1, 'a', 2, '1'])]
অ্যাডাম কাটজ

36

সহজ সমাধান:

var arr = [1, 3, 4, 1, 2, 1, 3, 3, 4, 1];
console.log([...new Set(arr)]);

বা:

var arr = [1, 3, 4, 1, 2, 1, 3, 3, 4, 1];
console.log(Array.from(new Set(arr)));


4
নোট করুন যে এটি IE10 এবং নীচে সমর্থিত নয়। নোট করুন আইই 11 + এবং সাফারি সীমিত সমর্থন সরবরাহ করে (উপরের উদাহরণটি কাজ করে
এমনটি নিশ্চিতও নয়

32

এটি করার সহজতম এবং দ্রুততম (ক্রোমে) উপায়:

Array.prototype.unique = function() {
    var a = [];
    for (var i=0, l=this.length; i<l; i++)
        if (a.indexOf(this[i]) === -1)
            a.push(this[i]);
    return a;
}

অ্যারের প্রতিটি আইটেমটি কেবল goes

জেসফিউমের মতে, এই ফাংশনটি আমি যে কোনও জায়গায় খুঁজে পেতে পারি তার মধ্যে দ্রুততম - যদিও নিজের নিজের যোগ করতে নির্দ্বিধায়।

অ-প্রোটোটাইপ সংস্করণ:

function uniques(arr) {
    var a = [];
    for (var i=0, l=arr.length; i<l; i++)
        if (a.indexOf(arr[i]) === -1 && arr[i] !== '')
            a.push(arr[i]);
    return a;
}

শ্রেণীবিভাজন

অ্যারে বাছাই করার সময়ও, নিম্নলিখিতটি দ্রুত:

Array.prototype.sortUnique = function() {
    this.sort();
    var last_i;
    for (var i=0;i<this.length;i++)
        if ((last_i = this.lastIndexOf(this[i])) !== i)
            this.splice(i+1, last_i-i);
    return this;
}

বা অ প্রোটোটাইপ:

function sortUnique(arr) {
    arr.sort();
    var last_i;
    for (var i=0;i<arr.length;i++)
        if ((last_i = arr.lastIndexOf(arr[i])) !== i)
            arr.splice(i+1, last_i-i);
    return arr;
}

এটি বেশিরভাগ নন-ক্রোম ব্রাউজারগুলিতে উপরের পদ্ধতির চেয়েও দ্রুত


লিনাক্সে, ক্রোম 55.0.2883 আপনার অরআরুনিক () পছন্দ করে এবং সুইলিয়ামস এর আর্কলোন 2.সোর্টফিল্টার () সবচেয়ে ধীর (78% ধীর)। তবে, ফায়ারফক্স ৫১.০.০ (প্রচুর অ্যাডন সহ) সুইলিয়ামসটি দ্রুততম (এখনও অন্য কোনও ক্রোমের ফলাফলের তুলনায় অপস / সেকেন্ডের চেয়ে ধীরে ধীরে) মোটিটির জিক্যুরি g .গ্রিপ (আরআর, জেকিফিল্টার) সবচেয়ে ধীর (46% ধীর) রয়েছে। আপনার অরুনিক () 30% ধীর ছিল। আমি প্রতিটি পরীক্ষা দু'বার চালিয়েছি এবং ধারাবাহিক ফলাফল পেয়েছি। উভয় ব্রাউজারে রাফায়েল এর আরজিট ইউনিক () দ্বিতীয় স্থান পেয়েছে।
অ্যাডাম কাটজ

jsPerf হয় বগী তাই এই পরীক্ষা করার জন্য আমার সম্পাদন করা সবকিছু আস্থা রাখেন নি, মুহূর্তে, কিন্তু এটা দুই পরীক্ষার যুক্ত করতে ফলাফলের যা করেছে: Cocco এর toUnique () beats Vamsi এর ES6 list.filter () উভয় ব্রাউজারে, swilliams 'sortFilter প্রহার () এফএফ-তে # 1 এর জন্য (সাজ্টফিল্টারটি 16% ধীর ছিল) এবং ক্রোমের উপর # 3 এর জন্য আপনার সাজানো পরীক্ষার (যা 2% কম ছিল) পিটিয়েছিল।
অ্যাডাম কাটজ

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

1
ঠিক আছে, আসলে uniqueফাংশনে আপনি যে অ্যালগরিদমটি প্রয়োগ করেছেন তার মধ্যে O (n ^ 2) জটিলতা রয়েছে যখন এর মধ্যে getUniqueরয়েছে ও (এন)। প্রথমটি ছোট ডেটা সেটগুলিতে দ্রুত হতে পারে, তবে আপনি গণিতগুলির সাথে কীভাবে তর্ক করতে পারেন :) আপনি নিশ্চিত করতে পারেন যে আপনি যদি এটির অ্যারেতে চালনা করেন তবে এটি 1E5 অনন্য আইটেমগুলিতে চালিত করুন
মিখাইল দুদিন ২

31

কেবল পারফর্মেন্স! এই কোডটি সম্ভবত এখানে থাকা সমস্ত কোডের চেয়ে 10X দ্রুত * সমস্ত ব্রাউজারে কাজ করে এবং এর সর্বনিম্ন মেমরির প্রভাবও রয়েছে .... এবং আরও

আপনার যদি পুরানো অ্যারেটি পুনরায় ব্যবহার করার প্রয়োজন না হয়; আপনি এটি অনন্য রূপান্তরিত করার আগে বিটিডব্লিউ প্রয়োজনীয় অন্যান্য ক্রিয়াকলাপগুলি সম্পাদন করুন সম্ভবত এটি করার খুব দ্রুততম উপায়টিও খুব ছোট।

var array=[1,2,3,4,5,6,7,8,9,0,1,2,1];

তাহলে আপনি এটি চেষ্টা করতে পারেন

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 1];

function toUnique(a, b, c) { //array,placeholder,placeholder
  b = a.length;
  while (c = --b)
    while (c--) a[b] !== a[c] || a.splice(c, 1);
  return a // not needed ;)
}
console.log(toUnique(array));
//[3, 4, 5, 6, 7, 8, 9, 0, 2, 1]

এই নিবন্ধটি পড়ে আমি এই ফাংশনটি নিয়ে এসেছি ...

http://www.shamasis.net/2009/09/fast-algorithm-to-find-unique-items-in-javascript-array/

আমি লুপ পছন্দ করি না এর অনেকগুলি পরামিতি রয়েছে। যেমন - লুপের মতো। সমস্ত ব্রাউজারের দ্রুততম লুপটি এমনটি ব্যতীত যা আমরা সবাইকে অনেক বেশি পছন্দ ... ক্রোম।

যাইহোক আমি প্রথম ফাংশনটি লিখেছিলাম যা যখন ব্যবহার করে। আর হ্যাঁ এটি নিবন্ধে পাওয়া ফাংশনটির থেকে কিছুটা দ্রুত। তবে যথেষ্ট নয়।unique2()

পরবর্তী পদক্ষেপে আধুনিক জেএস ব্যবহার করুন। Object.keys আমি অন্যটিকে js1.7 এর অবজেক্ট.কিসের সাথে লুপের জন্য প্রতিস্থাপন করেছি ... কিছুটা দ্রুত এবং খাটো (ক্রোম 2 এক্স দ্রুত);) দিয়ে আছি। যথেষ্ট না!.unique3()

এই মুহুর্তে আমি আমার অনন্য ক্রিয়ায় আমার কী প্রয়োজন তা নিয়ে ভাবছিলাম। আমার পুরানো অ্যারের দরকার নেই, আমি একটি দ্রুত ফাংশন চাই। সুতরাং লুপ + স্প্লাইস করার সময় আমি 2 ব্যবহার করেছি।unique4()

আমি মুগ্ধ হয়েছি তা বলা বাহুল্য।

ক্রোম: প্রতি সেকেন্ডে স্বাভাবিকভাবে 150,000 অপারেশনগুলি প্রতি সেকেন্ডে 1,800,000 অপারেশনে চলে যায়।

অর্থাত্: 80,000 অপস / এস বনাম 3,500,000 অপস / এস

ios: 18,000 op / s বনাম 170,000 অপস / এস

সাফারি: 80,000 অপস / এস বনাম 6,000,000 অপস / এস

প্রুফ http://jsperf.com/wgu বা আরও ভাল কনসোল.টাইম ব্যবহার করুন ... মাইক্রোটাইম ... যাই হোক না কেন

unique5() আপনি যদি পুরানো অ্যারে রাখতে চান তবে কী হয় তা আপনাকে দেখানোর জন্য।

আপনি Array.prototypeকী করছেন তা যদি আপনি না জানেন তবে ব্যবহার করবেন না । আমি ঠিক অনেক কপি এবং অতীত করেছি। Object.defineProperty(Array.prototype,...,writable:false,enumerable:false})আপনি যদি কোনও নেটিভ প্রোটোটাইপ. উদাহরণ তৈরি করতে চান তবে ব্যবহার করুন : https://stackoverflow.com/a/20463021/2450730

ডেমো http://jsfiddle.net/46S7g/

দ্রষ্টব্য: এই অপারেশনের পরে আপনার পুরানো অ্যারেটি নষ্ট হয়ে গেছে / হয়ে গেছে st

যদি আপনি উপরের কোডটি জিজ্ঞাসা করতে না পারেন, একটি জাভাস্ক্রিপ্ট বই পড়তে পারেন বা এখানে সংক্ষিপ্ত কোড সম্পর্কে কিছু ব্যাখ্যা রয়েছে। https://stackoverflow.com/a/21353032/2450730

কেউ কেউ ব্যবহার করছেন indexOf ... করবেন না ... http://jsperf.com/dgfgghfghfghghgfhgfhfghfhgfh

খালি অ্যারে জন্য

!array.length||toUnique(array); 

4
নোড.জেএস-তে পরীক্ষা করা হয়েছে, 100 ক্যারাল এরাল (স্ট্রিং) দিয়ে with ফলাফল আন্ডারস্কোর.জেএস _ ইউনিকের চেয়ে 2x ধীর ছিল ... যদিও আলাদা জাস্পেফ আপনার সাথে একমত ( jsperf.com/uniq-performance/5 ), আমি হতাশ :(
এক্স শিরাজ

3
আপনি জেএসপিফায় সঠিকভাবে পরীক্ষা করছেন না ... আপনার উদাহরণে আপনি প্রতিটি সময় ফাংশনটি সংজ্ঞায়িত করেন ... তবে আন্ডারস্কোর.জেএস ফাংশনগুলি ইতিমধ্যে সংজ্ঞায়িত হয়েছে .. এটি আমার ফাংশনটিকে শাস্তি দেয়। এছাড়াও 3 এবং 4 পরীক্ষা করা উচিত অন্য একটি বিষয় যা আমি বলি তা হ'ল আপনি যদি মিশ্র ভেরিয়েবল (স্ট্রিং এবং সংখ্যা) ব্যবহার করেন তবে আপনার একটি [b]! == a [সি] একটি [বি] দিয়ে প্রতিস্থাপন করা উচিত! = ক [সি]
কোকো

2
আমি নিশ্চিত না যে জেএসপুর সঠিক করেছে কিনা, তবে মনে হচ্ছে আপনার সমাধানের তুলনায় হ্রাস বিকল্পটি (এটি আমার পক্ষে বোঝা সহজ) যেটি 94% দ্রুত। jsperf.com/reduce-distinct সম্পাদনা: ক্রোম আপনার ধীরে ধীরে, এজ এ একই এবং ফায়ারফক্সে আরও দ্রুত।
ভিক্টর ইভেনস

3
কেবলমাত্র ছোট অ্যারে / লো ডুপ্লিকেট শতাংশের সাথে ব্যবহারযোগ্য । প্রতিবার অ-অনন্য বস্তুর সন্ধান পাওয়া গেলে, ইঞ্জিনটি বাকী সমস্ত উপাদানকে বামে স্থানান্তরিত করতে বাধ্য করা হবে : 1) তাদের উপর পুনরাবৃত্তি করা 2) সেগুলি পড়ুন 3) সেগুলি নতুন জায়গায় লিখুন। এবং তারপর, এটা আরো যে এক বিয়ে উপাদান সাথে নতুন অ্যারে, এবং আয় এটা ফলে ... অ্যালগরিদম দ্রুত বড় অ্যারে / আরো ঘন সদৃশ সঙ্গে জমিতে তৈরি করে। আকারের অ্যারেগুলির জন্য 1000-> 10000-> 50000 এবং 40% ডুপ্লিকেট, গড় নেওয়া সময় 2-> 775-> 19113 এমএসের মতো হবে। (আকারে 1-> x10-> x5, সময় 1-> x10-> x25 হিসাবে পরিবর্তন হবে) Chrome এ।
anzzet

1
ধন্যবাদ। চমৎকার পন্থা। তবে সঠিক আইটেম অর্ডার সম্পর্কে কী?
স্বাধীনভাবে

28

এখানে অনেক উত্তর নতুনদের জন্য দরকারী নাও হতে পারে। যদি অ্যারে ডি-ডুপিং করা কঠিন হয় তবে তারা কি প্রোটোটাইপ চেইন, বা এমনকি jQuery সম্পর্কে জানতে পারবে?

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

const cars = ['Volvo', 'Jeep', 'Volvo', 'Lincoln', 'Lincoln', 'Ford'];
const uniqueCars = Array.from(new Set(cars));

দ্য Array.fromযাতে আপনি সন্ত্রস্ত পদ্ধতি সমস্ত (বৈশিষ্ট্য) সহজ এক্সেস আছে একটি অ্যারের সেট রূপান্তর করার অ্যারে আছে দরকারী। এছাড়াও রয়েছে অন্যান্য উপায়ে একই জিনিস করছেন। তবে আপনার মোটেই প্রয়োজন Array.fromহবে না, কারণ সেটের জন্য ফর ইচের মতো প্রচুর দরকারী বৈশিষ্ট্য রয়েছে

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

// Create a list of cars, with duplicates.
var cars = ['Volvo', 'Jeep', 'Volvo', 'Lincoln', 'Lincoln', 'Ford'];
// Create a list of unique cars, to put a car in if we haven't already.
var uniqueCars = [];

// Go through each car, one at a time.
cars.forEach(function (car) {
    // The code within the following block runs only if the
    // current car does NOT exist in the uniqueCars list
    // - a.k.a. prevent duplicates
    if (uniqueCars.indexOf(car) === -1) {
        // Since we now know we haven't seen this car before,
        // copy it to the end of the uniqueCars list.
        uniqueCars.push(car);
    }
});

এটি তাত্ক্ষণিকভাবে পুনরায় ব্যবহারযোগ্য করতে, আসুন এটি একটি ফাংশনে রাখি।

function deduplicate(data) {
    if (data.length > 0) {
        var result = [];

        data.forEach(function (elem) {
            if (result.indexOf(elem) === -1) {
                result.push(elem);
            }
        });

        return result;
    }
}

সুতরাং সদৃশগুলি থেকে মুক্তি পেতে এখন আমরা এটি করব would

var uniqueCars = deduplicate(cars);

deduplicate(cars)অংশ হয়ে জিনিস আমরা নামে ফলাফলের যখন ফাংশন সমাপ্ত হবে।

আপনার পছন্দ মতো কোনও অ্যারের নামটি কেবল এটি পাস করুন।


যাইহোক, আমি দেখিয়েছি যে আমার কৌশলটি নমনীয়। এটি সংখ্যার জন্য সঠিকভাবে কাজ করবে।
শেঠ হল্লাদে

20
["Defects", "Total", "Days", "City", "Defects"].reduce(function(prev, cur) {
  return (prev.indexOf(cur) < 0) ? prev.concat([cur]) : prev;
 }, []);

[0,1,2,0,3,2,1,5].reduce(function(prev, cur) {
  return (prev.indexOf(cur) < 0) ? prev.concat([cur]) : prev;
 }, []);

আপনি কী ব্যাখ্যা করতে পারেন আপনি কেন pushঅ্যারের পরিবর্তে উপাদানটি ব্যবহার না করে concat? আমি পুশ ব্যবহার করার চেষ্টা করেছি এবং এটি ব্যর্থ হয়েছে। আমি একটি ব্যাখ্যা খুঁজছি
মাকেনোভা

1
কারণটি রিটার্ন ভ্যালুতে in কনট্যাট পরিবর্তিত অ্যারে (হ্রাস ফাংশনের অভ্যন্তরে ঠিক কী ফিরিয়ে আনতে হবে) ফিরিয়ে দেয়, যখন পুশ এমন একটি সূচক দেয় যা আপনি ধাক্কা দেওয়া মানটি অ্যাক্সেস করতে পারেন। এতে আপনার প্রশ্নের উত্তর হলো কি?
সার্জিজ

স্পষ্টতই, ক্রোম (এবং নোড) এ সমাধানটি বেশ দ্রুত is jsperf.com/reduce-distinct এটি ES6 সংস্করণ: [0,1,2,0,3,2,1,5].reduce((prev, cur) => ~prev.indexOf(cur) ? prev : prev.concat([cur]), []);
ভিক্টর ইভেনস

পার্শ্ব দ্রষ্টব্য: এই বাস্তবায়নটি NaNবন্ধুত্বপূর্ণ নয়
আলিরিজা

19

আমরা এটি ES6 সেট ব্যবহার করে করতে পারি:

var duplicatedArray = [1, 2, 3, 4, 5, 1, 1, 1, 2, 3, 4];
var uniqueArray = Array.from(new Set(duplicatedArray));

console.log(uniqueArray);

// আউটপুট হবে

uniqueArray = [1,2,3,4,5];

17

এই প্রোটোটাইপটি getUniqueপুরোপুরি সঠিক নয়, কারণ যদি আমার মতো অ্যারে থাকে: ["1",1,2,3,4,1,"foo"]এটি ফিরে আসবে ["1","2","3","4"]এবং "1"স্ট্রিং এবং1 একটি পূর্ণসংখ্যা হয়; তারা ভিন্ন ধরনের.

এখানে একটি সঠিক সমাধান:

Array.prototype.unique = function(a){
    return function(){ return this.filter(a) }
}(function(a,b,c){ return c.indexOf(a,b+1) < 0 });

ব্যবহার:

var foo;
foo = ["1",1,2,3,4,1,"foo"];
foo.unique();

উপরের উত্পাদন করবে ["1",2,3,4,1,"foo"]


1
নোটটি $foo = 'bar'হল ভেরিয়েবলগুলি ঘোষণার পিএইচপি উপায়। এটি জাভাস্ক্রিপ্টে কাজ করবে, তবে একটি অন্তর্নিহিত গ্লোবাল তৈরি করবে, এবং সাধারণত এটি করা উচিত নয়।
ক্যামিলো মার্টিন

@ ক্যামিলোমার্টিন দুঃখিত, তবে আপনি ভুল, oo ফু বিশ্বব্যাপী, কারণ উদাহরণটি বন্ধের মধ্যে নেই এবং তিনি ভের শব্দটি হারিয়েছেন। ডলারের সাথে কিছুই করার নেই jsfiddle.net/robaldred/L2MRb
রব

8
@ রব আমি যা বলছি ঠিক তা-ই বলছে, পিএইচপি লোকেরা ভাববে $fooযে আসলে জাভাস্ক্রিপ্টে ভেরিয়েবল ঘোষণার উপায় var foo
ক্যামিলো মার্টিন

13

অ্যারে.প্রোটোটাইপ না বাড়িয়ে (এটি একটি খারাপ অনুশীলন বলে মনে করা হয়) বা jquery / আন্ডারস্কোর ব্যবহার না করে আপনি কেবল filter অ্যারে ।

শেষ ঘটনাটি রেখে:

    function arrayLastUnique(array) {
        return array.filter(function (a, b, c) {
            // keeps last occurrence
            return c.indexOf(a, b + 1) < 0;
        });
    },

বা প্রথম ঘটনা:

    function arrayFirstUnique(array) {
        return array.filter(function (a, b, c) {
            // keeps first occurrence
            return c.indexOf(a) === b;
        });
    },

ঠিক আছে, এটি কেবল জাভাস্ক্রিপ্ট ECMAScript 5+, যার অর্থ কেবল আইআই 9+, তবে এটি স্থানীয় HTML / জেএস (উইন্ডোজ স্টোর অ্যাপ, ফায়ারফক্স ওএস, সেনচা, ফোনগ্যাপ, টাইটানিয়াম, ...) উন্নয়নের জন্য দুর্দান্ত।


2
এটি 1.6 জেএসের অর্থ এই নয় যে আপনি ব্যবহার করতে পারবেন না filter। এ MDN পৃষ্ঠা তারা Internet Explorer এর একটি বাস্তবায়ন আছে, আমি বলতে চাচ্ছি, পুরোনো ব্রাউজারে। এছাড়াও: জাতীয় 1.6 ফায়ারফক্সের JS ইঞ্জিন শুধুমাত্র বোঝায়, কিন্তু ডান জিনিস এটা যে এটা নাম ECMAScript 5. হয় বলে
ক্যামিলো মার্টিন

@ ক্যামিলোমার্টিন আমি 1.6 কে ECMAScript5 এ পরিবর্তন করেছি। ধন্যবাদ।
Cœur

13

জাদু

a.filter(e=>!(t[e]=e in t)) 

ও (এন) কর্মক্ষমতা ; আমরা ধরে নিই যে আপনার অ্যারেটি রয়েছে aএবং t={}। ব্যাখ্যা এখানে (+ + Jeppe ইম্প্রেশন।)


14
এই চেহারাটি এত দুর্দান্ত শীতল, কোনও
দৃ explanation়

3
আমি যা বোঝাতে চাইছিলাম তা হল আপনার উত্তরটি কিছুটা ব্যাখ্যা দিয়ে মন্তব্য করা এবং এটির ডিকনস্ট্রাকশন দিয়ে মন্তব্য করা উচিত। আশা করবেন না যে লোকেরা এর মতো দরকারী উত্তর পেয়ে যাবে। (যদিও এটি দেখতে সত্যিই দুর্দান্ত দেখাচ্ছে)
ওয়ান্ডেজ ইলেজকো

1
@ জেপ্প যখন আমি আপনার উন্নতি পরিচালনা করি তখন আমি আহ প্রভাবটি পাই (আমি জানি না যে আমি লুপের inতুলনায় অন্য নির্মাণের বাইরে অপারেটরটি ব্যবহার করতে পারি for: পি) - আপনাকে ধন্যবাদ - আমি এটির প্রশংসা করি এবং আপনার অন্যান্য ভাল উত্তরগুলিতে +2 দেবো ।
কামিল কিয়েসজেউস্কি

2
tফিল্টারিংয়ের পরেও এটি কী বৈশ্বিক চলক তৈরি করে না যা জীবিত থাকে ... ??
ফিলিপ

1
এটি সত্যই একটি জটিল সমাধান। দুর্ভাগ্যক্রমে, আপনি বিশ্বব্যাপী ভেরিয়েবল সংজ্ঞায়িত করতে এবং / অথবা গ্লোবালটি আড়াল করতে আপনার মডিউল বান্ডেলারের উপর নির্ভর না করতে চাইলে আপনাকে প্রকাশের বাইরে টি ঘোষণা করতে হবে। দেখতে অভিনব লাগে, তবে নিজেকে (এবং আপনার দেব দল) পক্ষে নিন এবং কেবল দুটি লাইন লিখুন: আসুন t = {}; a.filter (e =>! (t [e] = e in t))
ফরড04

13
[...new Set(duplicates)]

এটি সবচেয়ে সহজ এবং MDN ওয়েব ডক্স থেকে রেফারেন্স ।

const numbers = [2,3,4,4,2,3,3,4,4,5,5,6,6,7,5,32,3,4,5]
console.log([...new Set(numbers)]) // [2, 3, 4, 5, 6, 7, 32]

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

11

আপনি যদি প্রোটোটাইপ কাঠামোটি ব্যবহার করেন তবে 'লুপ' এর জন্য কোনও করার দরকার নেই, আপনি http://www.prototypejs.org/api/array/uniq এর মতো ব্যবহার করতে পারেন :

var a = Array.uniq();  

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

uniq ()

আমি ব্যবহার করতাম

আকার ()

এবং আমার সহজ ফলাফল ছিল। PS আমি যদি কিছু ভুল লিখে ফেলেছি তবে দুঃখিত

সম্পাদনা করুন: আপনি যদি অপরিশোধিত রেকর্ডগুলি থেকে পালাতে চান তবে আপনি যুক্ত করতে চাইতে পারেন

কম্প্যাক্ট ()

আগে, এই মত:

var a = Array.compact().uniq();  

14
যেহেতু আমি আরও ভাল উত্তর পেয়েছি, আমি বিষয়গুলি সম্পর্কে মনে করি কেবলমাত্র যিনি বলেছিলেন তার জন্য নয় সমস্ত লোকের জন্য
ডিসেবল

11

এখন সেট ব্যবহার করে আপনি সদৃশগুলি সরিয়ে আবার অ্যারেতে রূপান্তর করতে পারবেন।

var names = ["Mike","Matt","Nancy", "Matt","Adam","Jenny","Nancy","Carl"];

console.log([...new Set(names)])

আর একটি সমাধান হ'ল বাছাই করা এবং ফিল্টার ব্যবহার করা

var names = ["Mike","Matt","Nancy", "Matt","Adam","Jenny","Nancy","Carl"];
var namesSorted = names.sort();
const result = namesSorted.filter((e, i) => namesSorted[i] != namesSorted[i+1]);
console.log(result);


10

এটি কারণ 0জাভাস্ক্রিপ্টে একটি মিথ্যা মান।

this[i] অ্যারের মান 0 বা অন্য কোনও মিথ্যা মান হলে মিথ্যা হবে।


আহ্, ঠিক আছে আমি এখন দেখছি ... তবে এটি কার্যকর করার জন্য কোনও সহজ ফিক্স থাকতে পারে?
মটিটি

10
Array.prototype.getUnique = function() {
    var o = {}, a = []
    for (var i = 0; i < this.length; i++) o[this[i]] = 1
    for (var e in o) a.push(e)
    return a
}

আমি মনে করি অ্যারেতে অবজেক্ট / অ্যারে থাকলে এটি কাজ করবে না এবং আমি নিশ্চিত নই যে এটি স্কেলারের প্রকারটি সংরক্ষণ করবে কিনা I'm
ক্যামিলো মার্টিন

হ্যাঁ, সবকিছু স্ট্রিংফাই হয়ে যায়। এটি oকেবলমাত্র 1একটিটির পরিবর্তে মূল মান সংরক্ষণ করে ঠিক করা যেতে পারে , যদিও সাম্যতা তুলনাটি স্ট্রিংওয়াইজ হবে (যদিও, সমস্ত সম্ভাব্য জাভাস্ক্রিপ্টের সমতাগুলির মধ্যে এটি খুব অযৌক্তিক বলে মনে হয় না)।
প্রশংসাপত্র

অ্যারে.প্রোটোটাইপটি কেবল অগণিত পদ্ধতিতে বাড়ানো যেতে পারে .... অবজেক্ট.ডাইফাইনপ্রোপার্টি (অ্যারে.প্রোটোটাইপ, "গেট ইউনিক",}}) ... তবে হেল্পার অবজেক্টটি ব্যবহার করার ধারণাটি খুব সুন্দর
বোরটুনাক ১

10

আমার কিছুটা আলাদা সমস্যা হয়েছিল যেখানে আমাকে অ্যারের থেকে নকল আইডি বৈশিষ্ট্যযুক্ত জিনিসগুলি সরিয়ে ফেলতে হবে needed এই কাজ।

let objArr = [{
  id: '123'
}, {
  id: '123'
}, {
  id: '456'
}];

objArr = objArr.reduce((acc, cur) => [
  ...acc.filter((obj) => obj.id !== cur.id), cur
], []);

console.log(objArr);



7

গ্যাব্রিয়েল সিলভিরা কেন ফাংশনটি সেভাবে লিখেছিলেন তা আমি নিশ্চিত নই তবে একটি সরল রূপ যা আমার পক্ষে ঠিক ততটুকু ও ক্ষুদ্রাকরণ ছাড়াই কাজ করে:

Array.prototype.unique = function() {
  return this.filter(function(value, index, array) {
    return array.indexOf(value, index + 1) < 0;
  });
};

বা কফিস্ক্রিপ্টে:

Array.prototype.unique = ->
  this.filter( (value, index, array) ->
    array.indexOf(value, index + 1) < 0
  )

7

যদি আপনি অতিরিক্ত নির্ভরতার সাথে ঠিক থাকেন, বা আপনার কোডবেসে ইতিমধ্যে আপনার একটি লাইব্রেরি রয়েছে, আপনি লোড্যাশ (বা ইন্ডোরস্কোর) ব্যবহার করে কোনও অ্যারে থেকে নকলগুলি সরিয়ে ফেলতে পারেন।

ব্যবহার

যদি আপনার কোডবেসে ইতিমধ্যে এটি না থাকে তবে এনপিএম ব্যবহার করে এটি ইনস্টল করুন:

npm install lodash

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

import _ from 'lodash';
let idArray = _.uniq ([
    1,
    2,
    3,
    3,
    3
]);
console.dir(idArray);

বাইরে:

[ 1, 2, 3 ]

7

এটির অনেক উত্তর দেওয়া হয়েছে, তবে এটি আমার বিশেষ প্রয়োজনের দিকে নজর দেয়নি।

অনেক উত্তর এর মত:

a.filter((item, pos, self) => self.indexOf(item) === pos);

তবে এটি জটিল বস্তুর অ্যারেগুলির জন্য কাজ করে না।

বলুন আমাদের এর মতো অ্যারে রয়েছে:

const a = [
 { age: 4, name: 'fluffy' },
 { age: 5, name: 'spot' },
 { age: 2, name: 'fluffy' },
 { age: 3, name: 'toby' },
];

আমরা যদি অনন্য নামযুক্ত জিনিসগুলি চাই, আমাদের array.prototype.findIndexপরিবর্তে এটি ব্যবহার করা উচিত array.prototype.indexOf:

a.filter((item, pos, self) => self.findIndex(v => v.name === item.name) === pos);

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

6

থেকে Shamasis ভট্টাচার্য এর ব্লগ (হে (2n) সময় জটিলতা):

Array.prototype.unique = function() {
    var o = {}, i, l = this.length, r = [];
    for(i=0; i<l;i+=1) o[this[i]] = this[i];
    for(i in o) r.push(o[i]);
    return r;
};

থেকে পল আইরিশ 'র ব্লগ সাইটে সময় উপর উন্নতি .unique():

(function($){

    var _old = $.unique;

    $.unique = function(arr){

        // do the default behavior only if we got an array of elements
        if (!!arr[0].nodeType){
            return _old.apply(this,arguments);
        } else {
            // reduce the array to contain no dupes via grep/inArray
            return $.grep(arr,function(v,k){
                return $.inArray(v,arr) === k;
            });
        }
    };
})(jQuery);

// in use..
var arr = ['first',7,true,2,7,true,'last','last'];
$.unique(arr); // ["first", 7, true, 2, "last"]

var arr = [1,2,3,4,5,4,3,2,1];
$.unique(arr); // [1, 2, 3, 4, 5]

6

সহজ পদ্ধতিতে অনন্য অ্যারে মান সন্ধান করা

function arrUnique(a){
  var t = [];
  for(var x = 0; x < a.length; x++){
    if(t.indexOf(a[x]) == -1)t.push(a[x]);
  }
  return t;
}
arrUnique([1,4,2,7,1,5,9,2,4,7,2]) // [1, 4, 2, 7, 5, 9]

6

মনে হচ্ছে আমরা রাফেলের উত্তরটি হারিয়েছি , যা কয়েক বছরের জন্য গ্রহণযোগ্য উত্তর হিসাবে দাঁড়িয়েছিল। আপনার যদি মিশ্র ধরণের অ্যারে না থাকে তবে এটি (কমপক্ষে 2017 সালে) সেরা-পারফরম্যান্স সমাধান ছিল :

Array.prototype.getUnique = function(){
    var u = {}, a = [];
    for (var i = 0, l = this.length; i < l; ++i) {
        if (u.hasOwnProperty(this[i])) {
            continue;
        }
        a.push(this[i]);
        u[this[i]] = 1;
    }
return a;
}

আপনি যদি না একটি মিশ্র-টাইপ অ্যারে আছে, তবে আপনি হ্যাশ কী ধারাবাহিকভাবে করতে পারেন:

Array.prototype.getUnique = function() {
    var hash = {}, result = [], key; 
    for ( var i = 0, l = this.length; i < l; ++i ) {
        key = JSON.stringify(this[i]);
        if ( !hash.hasOwnProperty(key) ) {
            hash[key] = true;
            result.push(this[i]);
        }
    }
    return result;
}

5

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

Array.prototype.add = function (elem) {
   if (this.indexOf(elem) == -1) {
      this.push(elem);
   }
}

নমুনা:

set = [];
[1,3,4,1,2,1,3,3,4,1].forEach(function(x) { set.add(x); });

আপনি দেয় set = [1,3,4,2]

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