জাভাস্ক্রিপ্টে বস্তুর একটি অ্যারে থেকে আলাদা মান কীভাবে পাবেন?


383

ধরে নিচ্ছি আমার নিম্নলিখিতগুলি রয়েছে:

var array = 
    [
        {"name":"Joe", "age":17}, 
        {"name":"Bob", "age":17}, 
        {"name":"Carl", "age": 35}
    ]

স্বতন্ত্র বয়সের সকলের অ্যারে পেতে সক্ষম হবার সর্বোত্তম উপায় কী যে এর ফলাফলের অ্যারে পাই:

[17, 35]

আমি কি বিকল্পের সাথে ডেটা বা আরও ভাল পদ্ধতির কাঠামোগত গঠন করতে পারি যে আমাকে "বয়সের" মান পরীক্ষা করে প্রতিটি অ্যারে দিয়ে পুনরুক্তি করতে হবে না এবং এর অস্তিত্বের জন্য অন্য অ্যারের বিরুদ্ধে চেক করতে হবে এবং যদি তা যুক্ত না হয়?

যদি কোনও উপায় থাকে তবে আমি পুনরাবৃত্তি না করে স্বতন্ত্র যুগগুলি কেবল বের করতে পারতাম ...

বর্তমানের অকার্যকর উপায়ে আমি উন্নতি করতে চাই ... এর অর্থ যদি এই হয় যে "অ্যারে" পরিবর্তে অবজেক্টগুলির একটি অ্যারে না হয়ে কিছু অনন্য কী (যেমন "1,2,3") অবজেক্টগুলির "মানচিত্র" থাকে তবে তা হবে ঠিক আছে। আমি সর্বাধিক পারফরম্যান্স দক্ষ উপায় খুঁজছি।

নিম্নলিখিতটি আমি বর্তমানে এটি কীভাবে করছি তবে আমার জন্য, পুনরাবৃত্তিটি কার্যক্ষমতার জন্য কেবল ক্রমযুক্ত বলে মনে হচ্ছে যদিও এটি কাজ করে না ...

var distinct = []
for (var i = 0; i < array.length; i++)
   if (array[i].age not in distinct)
      distinct.push(array[i].age)

34
পুনরাবৃত্তি "দক্ষতার জন্য ক্রম্পী" নয় এবং আপনি "পুনরাবৃত্তি না করে" প্রতিটি উপাদানকে কিছু করতে পারবেন না। আপনি বিভিন্ন কার্যকরী-বর্ণনামূলক পদ্ধতি ব্যবহার করতে পারেন তবে শেষ পর্যন্ত কিছু স্তরের কিছুকে আইটেমগুলি দিয়ে পুনরাবৃত্তি করতে হবে।
ইভি

// 100% চলমান কোড কনস্ট লিস্ট অফফ্যাগস = [{আইডি: 1, লেবেল: "হ্যালো", রঙ: "লাল", বাছাই: 0}, {আইডি: 2, লেবেল: "ওয়ার্ল্ড", রঙ: "সবুজ", বাছাই : 1}, {আইডি: 3, লেবেল: "হ্যালো", রঙ: "নীল", বাছাই: 4}, {আইডি: 4, লেবেল: "রোদ", রঙ: "হলুদ", বাছাই: 5}, {আইডি : 5, লেবেল: "হ্যালো", রঙ: "লাল", বাছাই: 6}], কী = ['লেবেল', 'রঙ'], ফিল্টারড = তালিকাঅফট্যাগস.ফিল্টার ((গুলি => ও => (কে => ! s.has (k) && s.add (k)) (key.map (k => o [k])। join ('|'))) (নতুন সেট)); console.log (ফিল্টার);
সন্দীপ মিশ্র

1
অনুগ্রহ দুর্দান্ত, তবে প্রদত্ত ডেটা এবং উত্তর সহ প্রশ্নটি ইতিমধ্যে এখানে উত্তর দেওয়া হয়েছে: stackoverflow.com/questions/53542882/… । অনুগ্রহের উদ্দেশ্য কী? আমি কি এই বিশেষ সমস্যার উত্তর দুটি বা আরও কী দিয়ে দেব?
নিনা স্কলজ

Setঅবজেক্ট এবং mapগুলি অপব্যয়। এই কাজটি একটি সহজ .reduce()মঞ্চ নেয় takes
রেডু

উত্তর:


126

এটি যদি পিএইচপি হয় তবে আমি কীগুলি নিয়ে একটি অ্যারে তৈরি array_keysকরে শেষ পর্যন্ত নেব , তবে জেএস এর মতো বিলাসিতা নেই। পরিবর্তে, এটি চেষ্টা করুন:

var flags = [], output = [], l = array.length, i;
for( i=0; i<l; i++) {
    if( flags[array[i].age]) continue;
    flags[array[i].age] = true;
    output.push(array[i].age);
}

15
না, কারণ array_uniqueএখানে যেমন বলা হয়েছে তেমন বয়স নয়, পুরো আইটেমটির তুলনা করবে।
নাইট দ্য ডার্ক অ্যাবসোল

6
আমি মনে করি এর flags = {}চেয়ে আরও ভালflags = []
zhuguowei

3
@ ঝুগুওয়েই সম্ভবত, যদিও স্পারস অ্যারেগুলিতে আসলেই কোন ভুল নেই - এবং আমিও ধরে নিয়েছি যে ageএটি একটি তুলনামূলকভাবে ছোট পূর্ণসংখ্যা (<120 অবশ্যই)
নিট দ্য ডার্ক আবসোল

আমরা সমবয়সী মোট লোকের সংখ্যা কীভাবে মুদ্রণ করতে পারি?
ব্যবহারকারী 1788736

605

আপনি যদি ES6 / ES2015 ব্যবহার করছেন বা পরে আপনি এটি এইভাবে করতে পারেন:

const unique = [...new Set(array.map(item => item.age))];

এটি কীভাবে করা যায় তার একটি উদাহরণ এখানে


11
আমি একটি ত্রুটি TypeError: (intermediate value).slice is not a function
পেয়েছি

7
@ থমাস ... মানে স্প্রেড অপারেটর। এই ক্ষেত্রে এর অর্থ নতুন সেট তৈরি করা এবং এটি একটি তালিকায় ছড়িয়ে দেওয়া। আপনি এটি সম্পর্কে এখানে আরও জানতে পারেন: developer.mozilla.org/en-US/docs/Web/JavaScript/References/…
ভ্লাদ বেজডেন

10
টাইপস্ক্রিপ্টের জন্য আপনাকে অ্যারে.ফ্রমে () এ মোড়ানো নতুন সেট ব্যবহার করতে হবে ... আমি নীচে সেই উত্তরটি সরবরাহ করব। @ অংজবস
খ্রিস্টান ম্যাথু

4
অবজেক্টের একাধিক কীগুলির ভিত্তিতে অনন্য অবজেক্টগুলি খুঁজে পাওয়া সম্ভব?
জেফ্রি সুজিত

13
এই সমাধানটি কয়েক মাস আগে @ রাসেল ভায়ার দ্বারা প্রায় ভারব্যাটিম দিয়েছিল। আপনি কি বিদ্যমান উত্তরগুলি পরীক্ষা করেছেন? তবে তারপরেও, 266+ ভোট দেখায় যে অন্য কেউ চেক করে নি।
ড্যান ড্যাসকলেসকু

164

ES6 ব্যবহার করে

let array = [
  { "name": "Joe", "age": 17 },
  { "name": "Bob", "age": 17 },
  { "name": "Carl", "age": 35 }
];
array.map(item => item.age)
  .filter((value, index, self) => self.indexOf(value) === index)

> [17, 35]

2
যদি আমি এর সূচকটির সাথে মান পেতে চাই তবে আমি কীভাবে উদাহরণ পেতে পারি: আমি {"নাম" পেতে চাই: "বব", "বয়স": "17"}, name "নাম": "বব", "বয়স ":" 17 "}
আব্দুল্লাহ আল মামুন

10
এজন্য আপনাকে স্ক্রোলিং রাখতে হবে
আলেজান্দ্রো বাস্তিদাস

5
@ আবদুল্লাহআলম্যামুন আপনি কল করতে পরিবর্তে। ফিল্টারটিতে ম্যাপ ব্যবহার করতে পারেন। ম্যাপটি প্রথমে এইভাবে:array.filter((value, index, self) => self.map(x => x.age).indexOf(value.age) == index)
লিও

1
PS:। ম্যাপের ভিতরে। ফিল্টারটি ধীর হতে পারে, তাই বড় অ্যারেগুলির সাথে সাবধানতা অবলম্বন করুন
লিও

2
@ ইভাননসভ আপনার স্নিপেটটি খুব ভাল যদিও এটি চিত্রের ম্যাপ এবং ফিল্টার ডকুমেন্টেশনের পয়েন্টারগুলির সাথে কীভাবে কাজ করে তা ব্যাখ্যা করার বিভিন্ন পংক্তি এটি
নবজাতকদের

128

আপনি এটির মতো একটি অভিধান পদ্ধতি ব্যবহার করতে পারেন। মূলত আপনি "অভিধানে" কী হিসাবে স্বতন্ত্র হতে চান এমন মান নির্ধারণ করেন (এখানে আমরা অভিধান-মোড এড়ানোর জন্য একটি বস্তু হিসাবে অ্যারে ব্যবহার করি)। যদি কীটি উপস্থিত না থাকে তবে আপনি সেই মানটি স্বতন্ত্র হিসাবে যুক্ত করুন।

এখানে একটি কার্যকারী ডেমো রয়েছে:

var array = [{"name":"Joe", "age":17}, {"name":"Bob", "age":17}, {"name":"Carl", "age": 35}];
var unique = [];
var distinct = [];
for( let i = 0; i < array.length; i++ ){
  if( !unique[array[i].age]){
    distinct.push(array[i].age);
    unique[array[i].age] = 1;
  }
}
var d = document.getElementById("d");
d.innerHTML = "" + distinct;
<div id="d"></div>

এটি O (n) হবে যেখানে n হ'ল অ্যারেতে বস্তুর সংখ্যা এবং মি হ'ল অনন্য মানের সংখ্যা of ও (এন) এর চেয়ে দ্রুত আর কোনও উপায় নেই কারণ আপনাকে অবশ্যই প্রতিটি মান কমপক্ষে একবার পরীক্ষা করতে হবে।

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

আমি উপরের কোডটি আপডেট করেছি, যেমনটি উল্লেখ করা হয়েছে, তবে আমি 3 টির পরিবর্তে 1000 টি বস্তুর সন্ধানের জন্য jsperf আপডেট করেছি 3 3 জড়িত পারফরম্যান্সের অনেকগুলি অসুবিধা ( অপ্রচলিত jsperf ) উপেক্ষা করে

কর্মক্ষমতা

https://jsperf.com/filter-vs-d অভিধান- more- data আমি যখন এই অভিধানটি চালিয়েছিলাম তখন এটি ছিল 96% দ্রুত faster

ফিল্টার বনাম অভিধান


4
দ্রুত এবং কোনও অতিরিক্ত প্লাগইন ছাড়াই প্রয়োজনীয়। সত্যিই দুর্দান্ত
মিহাই

2
কীভাবেif( typeof(unique[array[i].age]) == "undefined"){ distinct.push(array[i].age); unique[array[i].age] = 0; }
নিরবধি

7
বাহ মানচিত্রের বিকল্পের পক্ষে কার্য সম্পাদন সত্যিই পরিবর্তিত হয়েছে। যে jsperf লিঙ্ক ক্লিক করুন!
এটি

1
@ 98 পারসেন্টমনকি - অবজেক্টটি "অভিধানের পদ্ধতির" সুবিধার্থে ব্যবহৃত হয়েছিল। বস্তুর অভ্যন্তরে, ট্র্যাক করা প্রতিটি ঘটনা একটি কী (বা একটি বিন) হিসাবে যুক্ত করা হয়। এইভাবে, যখন আমরা কোনও ঘটনার মুখোমুখি হই, আমরা কী (বা বিন) উপস্থিত কিনা তা পরীক্ষা করে দেখতে পারি; যদি এটা কোন অস্তিত্ব নেই, আমরা জানি যে সংঘটন অনন্য নয় - যদি এটা কোন অস্তিত্ব নেই, আমরা জানি যে সংঘটন অনন্য এবং এটি যোগ করুন।
ট্রাভিস জে

1
@ 98percentmonkey - কোনও বস্তু ব্যবহারের কারণ হ'ল অনুসন্ধানটি O (1) হ'ল যেহেতু এটি একবারে কোনও নামের নামের জন্য যাচাই করে, অন্যদিকে অ্যারে হ'ল (এন) যেহেতু অস্তিত্বের জন্য যাচাই করার জন্য প্রতিটি মান দেখতে হয়। প্রক্রিয়া শেষে, অবজেক্টের কী (বিন )গুলির সেটটি অনন্য উপস্থিতির সেটটি উপস্থাপন করে।
ট্র্যাভিস জে

90

25 ই আগস্ট, 2017 পর্যন্ত আপনি টাইপস্ক্রিপ্টের জন্য ES6 এর মাধ্যমে নতুন সেটটি ব্যবহার করে এটি সমাধান করবেন

Array.from(new Set(yourArray.map((item: any) => item.id)))

3
এই সাহায্য করেছে, ধন্যবাদ আগে পেয়েছিলাম। টাইপ 'সেট' কোনও অ্যারে টাইপ নয়
রবার্ট কিং

1
এটি একটি দুর্দান্ত উত্তর। যতক্ষণ না আমি এইটির কাছে স্ক্রোল করেছি, আমি একটি উত্তর লিখতে যাচ্ছি: অবজেক্ট.কিজ (ভ্যালু.স্রেড <<<> ((x, y) => {x [y] = নাল; রিটার্ন এক্স;}, {} )); তবে এই উত্তরটি আরও সংক্ষিপ্ত এবং কেবল স্ট্রিংয়ের পরিবর্তে সমস্ত ডেটা ধরণের ক্ষেত্রে প্রযোজ্য।
jgosar

1
এই উত্তর দর্শনীয়!
লুক্কোডস

78

ES6 বৈশিষ্ট্য ব্যবহার করে আপনি এর মতো কিছু করতে পারেন:

const uniqueAges = [...new Set( array.map(obj => obj.age)) ];

6
এই পদ্ধতিটি কেবল আদিম ধরণেরগুলিতে কাজ করবে (যা এখানে বয়স হিসাবে সংখ্যার একটি অ্যারে) তবুও বস্তুর জন্য ব্যর্থ হবে।
k0pernikus

এটি কী কীভাবে এটি দুটি কী সহ বস্তুর জন্য কাজ করবে?
সেগপ্রকাশ

1
এরকম কিছুconst uniqueObjects = [ ...new Set( array.map( obj => obj.age) ) ].map( age=> { return array.find(obj => obj.age === age) } )
হার্লি বি

62

আমি কেবল ম্যাপগুলি এবং ডুপগুলি সরিয়ে ফেলতাম:

var ages = array.map(function(obj) { return obj.age; });
ages = ages.filter(function(v,i) { return ages.indexOf(v) == i; });

console.log(ages); //=> [17, 35]

সম্পাদনা: আট! পারফরম্যান্সের দিক থেকে সবচেয়ে কার্যকর উপায় নয়, তবে সবচেয়ে সর্বাধিক পঠনযোগ্য আইএমও। আপনি যদি সত্যিই মাইক্রো অপ্টিমাইজেশান সম্পর্কে যত্নবান হন বা আপনার বিপুল পরিমাণে ডেটা থাকে তবে একটি নিয়মিত forলুপটি আরও "দক্ষ" হতে চলেছে।


3
@ এলক্লানারস - "সর্বাধিক পারফরম্যান্স দক্ষ উপায়" - এই পদ্ধতিটি ধীর
ট্র্যাভিস জে

1
@ ইভী: আমি দেখছি আপনার উত্তরের আন্ডারস্কোর সংস্করণটি খুব দ্রুত নয় , আমি বলতে চাইছি, শেষ পর্যন্ত আপনি আরও বেশি সুবিধাজনক কি তা বেছে নিন, আমি সন্দেহ করি যে 1-30% কম-বেশি জেনেরিক পরীক্ষায় "বিশাল উন্নতি" প্রতিফলিত করে এবং যখন ওপি / এস হাজারে থাকে ।
elclanrs

4
ঠিক আছে, নিশ্চিত মাত্র তিনটি উপাদান সহ , দ্রুততম জিনিসটি হ'ল তিনটি ভেরিয়েবল তৈরি করা এবং কিছু ifগুলি ব্যবহার করা । আপনি তিন মিলিয়ন দিয়ে কিছু খুব আলাদা ফলাফল পাবেন।
ইভি

1
দ্রুত নয় তবে আমার ক্ষেত্রে এটি কৌশলটি করেছে কারণ আমি বড় ডেটাসেটের সাথে ডিল করছি না, ধন্যবাদ।
ফিলিপ অ্যালারকন

37
var unique = array
    .map(p => p.age)
    .filter((age, index, arr) => arr.indexOf(age) == index)
    .sort(); // sorting is optional

// or in ES6

var unique = [...new Set(array.map(p => p.age))];

// or with lodash

var unique = _.uniq(_.map(array, 'age'));

ES6 উদাহরণ

const data = [
  { name: "Joe", age: 17}, 
  { name: "Bob", age: 17}, 
  { name: "Carl", age: 35}
];

const arr = data.map(p => p.age); // [17, 17, 35]
const s = new Set(arr); // {17, 35} a set removes duplications, but it's still a set
const unique = [...s]; // [17, 35] Use the spread operator to transform a set into an Array
// or use Array.from to transform a set into an array
const unique2 = Array.from(s); // [17, 35]

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

সূচক বনাম সূচক ব্যবহার করা প্রথমটি কেবল উজ্জ্বল।
হায়রে

নোট করুন যে এটি কেবল আদিম মানের জন্য কাজ করে। আপনার যদি তারিখগুলির অ্যারে থাকে তবে আপনার আরও কয়েকটি কাস্টমাইজড পদ্ধতি দরকার। এখানে আরও পড়ুন: কোডবুর্স্ট.আইও
জাভাস্ক্রিপ্ট-

36

যারা কী দ্বারা স্বতন্ত্র সমস্ত বৈশিষ্ট্য সহ বস্তুটি ফিরে আসতে চান তাদের জন্য

const array =
  [
    { "name": "Joe", "age": 17 },
    { "name": "Bob", "age": 17 },
    { "name": "Carl", "age": 35 }
  ]

const key = 'age';

const arrayUniqueByKey = [...new Map(array.map(item =>
  [item[key], item])).values()];

console.log(arrayUniqueByKey);

   /*OUTPUT
       [
        { "name": "Bob", "age": 17 },
        { "name": "Carl", "age": 35 }
       ]
   */

 // Note: this will pick the last duplicated item in the list.


2
দ্রষ্টব্য: এটি তালিকার শেষ নকল আইটেমটি চয়ন করবে।
ইউজিন কুলাবোভভ

1
উত্তরে এটি যুক্ত করা হচ্ছে!
অরুণ কুমার সায়নী

1
ঠিক আমি খুঁজছেন ছিল কি. ভাগ করে নেওয়ার জন্য একটি টন ধন্যবাদ!
দেবনার

1
আমি মনে করি এটি সৎ হওয়ার পক্ষে শীর্ষস্থানীয় উত্তর হওয়া উচিত!
জারোস্লাভ বেনক

26

ইতিমধ্যে অনেকগুলি বৈধ উত্তর রয়েছে, তবে আমি একটি যুক্ত করতে চেয়েছিলাম যা কেবলমাত্র reduce()পদ্ধতিটি ব্যবহার করে কারণ এটি পরিষ্কার এবং সহজ।

function uniqueBy(arr, prop){
  return arr.reduce((a, d) => {
    if (!a.includes(d[prop])) { a.push(d[prop]); }
    return a;
  }, []);
}

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

var array = [
  {"name": "Joe", "age": 17}, 
  {"name": "Bob", "age": 17}, 
  {"name": "Carl", "age": 35}
];

var ages = uniqueBy(array, "age");
console.log(ages); // [17, 35]

20

forEach@ Travis-ঞ এর উত্তর সংস্করণ (আধুনিক ব্রাউজার এবং নোড জেএস বিশ্বের উপর সহায়ক):

var unique = {};
var distinct = [];
array.forEach(function (x) {
  if (!unique[x.age]) {
    distinct.push(x.age);
    unique[x.age] = true;
  }
});

ক্রোম v29.0.1547 এ 34% দ্রুত: http://jsperf.com/filter-versus-d অভিধান/3

এবং একটি জেনেরিক সমাধান যা ম্যাপার ফাংশন গ্রহণ করে (সরাসরি মানচিত্রের তুলনায় স্বল্প, তবে এটি প্রত্যাশিত):

function uniqueBy(arr, fn) {
  var unique = {};
  var distinct = [];
  arr.forEach(function (x) {
    var key = fn(x);
    if (!unique[key]) {
      distinct.push(key);
      unique[key] = true;
    }
  });
  return distinct;
}

// usage
uniqueBy(array, function(x){return x.age;}); // outputs [17, 35]

1
আমি জেনেরিক সমাধানটি সবচেয়ে ভাল পছন্দ করি কারণ সত্যিকারের বিশ্বের দৃশ্যে বয়সই একমাত্র স্বতন্ত্র মান unlikely
তোফট

5
জেনেরিকের মধ্যে, আসল উপাদানগুলির একটি তালিকা ফিরিয়ে দিতে "ডিফারেক্ট.পশ (কী)" থেকে "ডিফারেন্ট.পশ (এক্স)" এ পরিবর্তন করুন, যা আমি অত্যন্ত ব্যবহারযোগ্য বলে মনে করি!
সিলাস হানসেন

15

আমি ডিফল্টরূপে সমস্ত নতুন প্রকল্পে ইন্ডারস্কোরকে স্টিক করা শুরু করেছি যাতে এই ছোট্ট ডেটা-মুংয়ের সমস্যাগুলি সম্পর্কে আমাকে কখনই ভাবতে হবে না।

var array = [{"name":"Joe", "age":17}, {"name":"Bob", "age":17}, {"name":"Carl", "age": 35}];
console.log(_.chain(array).map(function(item) { return item.age }).uniq().value());

উত্পাদন [17, 35]


13

এটি সমাধানের জন্য এখানে আরও একটি উপায়:

var result = {};
for(var i in array) {
    result[array[i].age] = null;
}
result = Object.keys(result);

এই সমাধানটি অন্যের সাথে তুলনা করে কত দ্রুত হয় তা আমার কোনও ধারণা নেই তবে আমি ক্লিনার চেহারা পছন্দ করি। ;-)


সম্পাদনা: ঠিক আছে, উপরেরটি এখানে সবথেকে ধীর সমাধান বলে মনে হচ্ছে।

আমি এখানে একটি পারফরম্যান্স পরীক্ষার কেস তৈরি করেছি: http://jsppha.com/distinct-values-from-array

বয়সগুলি (পূর্ণসংখ্যা) পরীক্ষা করার পরিবর্তে, আমি নামগুলি (স্ট্রিংস) তুলনা করতে পছন্দ করেছি chose

পদ্ধতি 1 (টিএস এর সমাধান) খুব দ্রুত। আকর্ষণীয়ভাবে যথেষ্ট, পদ্ধতি 7 অন্যান্য সমস্ত সমাধানকে ছাড়িয়ে যায়, এখানে আমি মাত্র .indexOf () থেকে মুক্তি পেয়েছি এবং লুপযুক্ত ফাংশন কলিং এড়ানো এটিকে একটি "ম্যানুয়াল" বাস্তবায়ন ব্যবহার করেছি:

var result = [];
loop1: for (var i = 0; i < array.length; i++) {
    var name = array[i].name;
    for (var i2 = 0; i2 < result.length; i2++) {
        if (result[i2] == name) {
            continue loop1;
        }
    }
    result.push(name);
}

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

আমি ঠিক নিশ্চিত নই যে উপরের স্নিপেটগুলি অন্যদের তুলনায় এত দ্রুত কেন সম্ভবত আমার চেয়ে বুদ্ধিমানের কোনও উত্তর থাকতে পারে। ;-)


9

লোডাশ ব্যবহার

var array = [
    { "name": "Joe", "age": 17 },
    { "name": "Bob", "age": 17 },
    { "name": "Carl", "age": 35 }
];
_.chain(array).pluck('age').unique().value();
> [17, 35]

2
প্রশ্নটিতে বর্ণিত যেমন আপনি সরল জাভাস্ক্রিপ্ট দিয়ে এটি কীভাবে ব্যাখ্যা করতে পারেন?
রসিন

এটি একটি আন্ডারস্কোর ফাংশন _চইন
ভিনি

2
তবে প্লক () লোডাসে নেই।
যশ ভেকেরিয়া

1
_.chain (অ্যারে) .map ( 'বয়স') অনন্য () মান ()।। আমার জন্য কাজ।
যশ ভেকেরিয়া

সংস্করণ 4.0 ছিল কিছু ভঙ্গ পরিবর্তন পড়ুন - stackoverflow.com/a/31740263/4050261
আদর্শ Madrecha




5

এখানে একটি বহুমুখী সমাধান যা ব্যবহার হ্রাস, ম্যাপিংয়ের অনুমতি দেয় এবং সন্নিবেশ ক্রম বজায় রাখে ব্যবহার করে।

আইটেম : একটি অ্যারে

ম্যাপার : একটি অ্যানারি ফাংশন যা আইটেমটিকে মানদণ্ডে মানচিত্র করে বা আইটেমটি নিজে খালি খালি করে।

function distinct(items, mapper) {
    if (!mapper) mapper = (item)=>item;
    return items.map(mapper).reduce((acc, item) => {
        if (acc.indexOf(item) === -1) acc.push(item);
        return acc;
    }, []);
}

ব্যবহার

const distinctLastNames = distinct(items, (item)=>item.lastName);
const distinctItems = distinct(items);

আপনি এটি আপনার অ্যারে প্রোটোটাইপে যুক্ত করতে পারেন এবং যদি এটি আপনার স্টাইল হয় তবে আইটেমগুলির প্যারামিটারটি ছেড়ে দিতে পারেন ...

const distinctLastNames = items.distinct( (item)=>item.lastName) ) ;
const distinctItems = items.distinct() ;

আপনি ম্যাচের গতি বাড়ানোর জন্য অ্যারের পরিবর্তে একটি সেটও ব্যবহার করতে পারেন।

function distinct(items, mapper) {
    if (!mapper) mapper = (item)=>item;
    return items.map(mapper).reduce((acc, item) => {
        acc.add(item);
        return acc;
    }, new Set());
}

5

const x = [
  {"id":"93","name":"CVAM_NGP_KW"},
  {"id":"94","name":"CVAM_NGP_PB"},
  {"id":"93","name":"CVAM_NGP_KW"},
  {"id":"94","name":"CVAM_NGP_PB"}
].reduce(
  (accumulator, current) => accumulator.some(x => x.id === current.id)? accumulator: [...accumulator, current ], []
)

console.log(x)

/* output 
[ 
  { id: '93', name: 'CVAM_NGP_KW' },
  { id: '94', name: 'CVAM_NGP_PB' } 
]
*/


2
এটি ও (এন ^ 2) এর মতো দেখাচ্ছে
সেগপ্রকাশ

4

সবেমাত্র এটি খুঁজে পেয়েছি এবং আমি এটি দরকারী বলে মনে করি

_.map(_.indexBy(records, '_id'), function(obj){return obj})

আবার আন্ডারস্কোর ব্যবহার করে , সুতরাং আপনার যদি এই জাতীয় কোনও বিষয় থাকে

var records = [{_id:1,name:'one', _id:2,name:'two', _id:1,name:'one'}]

এটি আপনাকে কেবল অনন্য সামগ্রী দেবে।

এখানে যা ঘটে তা হ'ল indexByএটির মতো একটি মানচিত্র ফিরে আসে

{ 1:{_id:1,name:'one'}, 2:{_id:2,name:'two'} }

এবং কেবল এটি একটি মানচিত্রের কারণে, সমস্ত কীগুলি অনন্য।

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

আপনি যদি স্বতন্ত্র মান প্রয়োজন

_.map(_.indexBy(records, '_id'), function(obj,key){return key})

মনে রাখবেন যে keyস্ট্রিং হিসাবে ফেরত এসেছে, পরিবর্তে আপনার যদি পূর্ণসংখ্যার প্রয়োজন হয়, আপনার উচিত

_.map(_.indexBy(records, '_id'), function(obj,key){return parseInt(key)})

4

আমি মনে করি আপনি গ্রুপবাই ফাংশন সন্ধান করছেন (লোড্যাশ ব্যবহার করে)

_personsList = [{"name":"Joe", "age":17}, 
                {"name":"Bob", "age":17}, 
                {"name":"Carl", "age": 35}];
_uniqAgeList = _.groupBy(_personsList,"age");
_uniqAges = Object.keys(_uniqAgeList);

ফলাফল উত্পাদন করে:

17,35

জেএসফিডাল ডেমো: http://jsfiddle.net/4J2SX/201/


3

আমার মতো আপনি যদি গতির সাথে আপস না করে আরও "কার্যকরী" পছন্দ করেন, এই উদাহরণটি বন্ধ হ্রাস কমানোর অভ্যন্তরে মোড়ানো দ্রুত অভিধান অনুসন্ধান ব্যবহার করে।

var array = 
[
    {"name":"Joe", "age":17}, 
    {"name":"Bob", "age":17}, 
    {"name":"Carl", "age": 35}
]
var uniqueAges = array.reduce((p,c,i,a) => {
    if(!p[0][c.age]) {
        p[1].push(p[0][c.age] = c.age);
    }
    if(i<a.length-1) {
        return p
    } else {
        return p[1]
    }
}, [{},[]])

এই পরীক্ষা অনুযায়ী আমার সমাধান প্রস্তাবিত উত্তরের চেয়ে দ্বিগুণ দ্রুত



3

আমি জানি আমার কোডটি সামান্য দৈর্ঘ্য এবং অল্প সময়ের জটিলতা তবে এটি বোধগম্য তাই আমি এইভাবে চেষ্টা করেছি।

আমি এখানে প্রোটোটাইপ ভিত্তিক ফাংশন বিকাশ করার চেষ্টা করছি এবং কোডও পরিবর্তন করে।

এখানে, ডিস্ট্রিন্টটি আমার নিজস্ব প্রোটোটাইপ ফাংশন।

<script>
  var array = [{
      "name": "Joe",
      "age": 17
    },
    {
      "name": "Bob",
      "age": 17
    },
    {
      "name": "Carl",
      "age": 35
    }
  ]

  Array.prototype.Distinct = () => {
    var output = [];
    for (let i = 0; i < array.length; i++) {
      let flag = true;
      for (let j = 0; j < output.length; j++) {
        if (array[i].age == output[j]) {
          flag = false;
          break;
        }
      }
      if (flag)
        output.push(array[i].age);
    }
    return output;
  }
  //Distinct is my own function
  console.log(array.Distinct());
</script>


2

আপনার যদি অ্যারে.প্রোটোটাইপ.কম অন্তর্ভুক্ত থাকে বা এটি পলিফিল করতে রাজি হন তবে এটি কাজ করে:

var ages = []; array.forEach(function(x) { if (!ages.includes(x.age)) ages.push(x.age); });

1

আমার নীচের কোডটি বয়সের অনন্য অ্যারে পাশাপাশি ডুপ্লিকেট বয়স না থাকা নতুন অ্যারে প্রদর্শন করবে

var data = [
  {"name": "Joe", "age": 17}, 
  {"name": "Bob", "age": 17}, 
  {"name": "Carl", "age": 35}
];

var unique = [];
var tempArr = [];
data.forEach((value, index) => {
    if (unique.indexOf(value.age) === -1) {
        unique.push(value.age);
    } else {
        tempArr.push(index);    
    }
});
tempArr.reverse();
tempArr.forEach(ele => {
    data.splice(ele, 1);
});
console.log('Unique Ages', unique);
console.log('Unique Array', data);```

1

কোটলিনের মতো জেনেরিক কেসের জন্য আমি টাইপস্ক্রিপ্টে আমার নিজের লেখা ছিল Array.distinctBy {}...

function distinctBy<T, U extends string | number>(array: T[], mapFn: (el: T) => U) {
  const uniqueKeys = new Set(array.map(mapFn));
  return array.filter((el) => uniqueKeys.has(mapFn(el)));
}

যেখানে Uঅবশ্যই হাশেবল। অবজেক্টের জন্য আপনার প্রয়োজন হতে পারে https://www.npmjs.com/package/es6-json-stable-stringify


1

যদি আপনার পুরো অবজেক্টের অনন্য প্রয়োজন হয়

const _ = require('lodash');

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

_.uniqWith(objects, _.isEqual);

[অবজেক্ট {x: 1, y: 2}, অবজেক্ট {x: 2, y: 1}]


ডাউনভোটার: মন বোঝাচ্ছে ডাউনটা কেন?
সেগপ্রকাশ

1

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

var o = {}; array.map(function(v){ o[v.age] = 1; });

তারপরে আমরা হ্যাশটিকে অনন্য মানের একটি অ্যারেতে হ্রাস করতে পারি:

var a2 = []; for (k in o){ a2.push(k); }

যে আপনার প্রয়োজন হয়। অ্যারে A2 শুধু অনন্য বয়সের ধারণ করে।


1

দুর্দান্ত পারফরম্যান্স সহ সাধারণ ওয়ান-লাইনার। আমার পরীক্ষাগুলিতে ES6 সমাধানগুলির চেয়ে 6% দ্রুত ।

var ages = array.map(function(o){return o.age}).filter(function(v,i,a) {
    return a.indexOf(v)===i
});

@ Jeb50 পড়তে সহজ যে কোনও মাল্টি-লাইন যুক্ত করার জন্য যত্ন? এখানকার অন্যদের দিকে তাকিয়ে আমি বুঝতে পারি না যে তারা পড়া বা বুঝতে সহজ understand আমি মনে করি এটি কোনও ফাংশনে এটি করা ভাল যা এটি কী করে তা বর্ণনা করে।
ক্রেগ

2
তীর ফাংশন সঙ্গে: array.map( o => o.age).filter( (v,i,a) => a.indexOf(v)===i)। আমি ফাংশনটির কীওয়ার্ডটি খুব কমই এখন ব্যবহার করি যে আমি যখন দেখি তখন দু'বার পড়তে হয় 😊
Drenai
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.