সদৃশ সরান একটি অ্যারে গঠন


101

আমার কাছে এমন ধরণের অবজেক্টের অ্যারে রয়েছে:

var array = [
    {id:123, value:"value1", name:"Name1"},
    {id:124, value:"value2", name:"Name1"},
    {id:125, value:"value3", name:"Name2"},
    {id:126, value:"value4", name:"Name2"}
    ...
];

আপনি দেখতে পাচ্ছেন, কিছু নাম পুনরাবৃত্তি হয়েছে। আমি কেবল নামের সাথে একটি নতুন অ্যারে পেতে চাই, তবে যদি কিছু নাম পুনরাবৃত্তি করে তবে আমি এটিকে আবার যুক্ত করতে চাই না। আমি এই অ্যারে চাই:

var newArray = ["Name1", "Name2"];

আমি এটি দিয়ে এটি করার চেষ্টা করছি map:

var newArray = array.map((a) => {
    return a.name;
});

তবে সমস্যাটি এই যে ফিরে আসে:

newArray = ["Name1", "Name1", "Name2", "Name2"];

আমি কীভাবে ভিতরে কিছু শর্ত সেট করতে পারি map, সুতরাং এটি ইতিমধ্যে বিদ্যমান এমন কোনও উপাদান ফেরত দেবে না? আমি এটি mapবা অন্য কোনও ECMAScript 5 বা ECMAScript 6 বৈশিষ্ট্যের সাহায্যে এটি করতে চাই।


4
তারপরে অ্যারে থেকে সদৃশগুলি সরান।
তুষার



আইডি: 125 যুক্ত লাইনটি কমা দিয়ে শেষ হবে না কেন?
পিটার মর্টেনসেন

অনুগ্রহ করে নোট করুন যে .indexOf () ব্যবহার করে সমস্ত উত্তরের খারাপ অভিনয় থাকবে চতুর্ভুজ সময় জটিলতার কারণে অ্যারে বড় হলে খুব । আমি ES6 সেট ব্যবহার করার বা অভিধান হিসাবে কোনও ES5 অবজেক্ট ব্যবহার করার পরামর্শ দেব ।
জোয়েটউইডেল

উত্তর:


212

ES6 এর সাহায্যে আপনি Setকেবলমাত্র বস্তুর নাম ম্যাপিংয়ের পরে অনন্য মানের জন্য ব্যবহার করতে পারেন ।

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

const array = [{ id: 123, value: "value1", name:"Name1" }, { id: 124, value: "value2", name: "Name1" }, { id: 125, value: "value3", name: "Name2" }, { id: 126, value: "value4", name: "Name2" }],
      names = [...new Set(array.map(a => a.name))];

console.log(names);


9
আমার তথ্যের জন্য .. কি করে ...?
রাজশেখর রেড্ডি

9
@ রাজশেকার রেডি, এটি একটি পুনরাবৃত্তিযোগ্য অবজেক্টের সাথে অ্যারে তৈরির জন্য একটি স্প্রেড সিনট্যাক্স...
নিনা শোল্জ

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

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

4
@ KRyan ES6 এত নতুন? ২০১৫ সালের জুনে এটি চূড়ান্ত হয়েছে। এটি নতুন বৈশিষ্ট্যগুলি বোঝার এবং ব্যবহার শুরু করার সময় হয়েছে
edc65

65

আপনি যদি কোনও জাভাস্ক্রিপ্ট সমাধান সন্ধান করছেন যা ES 6 নয় (কোনও সেট নেই) আপনি অ্যারের reduceপদ্ধতিটি ব্যবহার করতে পারেন :

var array=[
  {id:123, value:"value1", name:"Name1"},
  {id:124, value:"value2", name:"Name1"},
  {id:125, value:"value3", name:"Name2"},
  {id:126, value:"value4", name:"Name2"}
];
var names = array.reduce(function (a, b) {
  if (a.indexOf(b.name) == -1) {
    a.push(b.name)
  }
  return a;
}, []);

console.log(names);


4
এই উত্তরের আরও সুবিধা রয়েছে যে এর জন্য অন্তর্বর্তী অ্যারে বা সেটগুলির প্রয়োজন নেই, বিশেষত কেবলমাত্র নিজের নাম রয়েছে। (এটি অবজেক্টগুলির অ্যারে থেকে অবজেক্টগুলির অ্যারেতে সরাসরি যায়)) +1
জেএমপিসি 26

@Irestrestabearonce, এই দ্বিতীয় পরম ফিরে আসা মত একই জিনিস না?
কাইডো

হ্যাঁ তবে এটি সর্ট বা ফিল্টারের মতো এক থেকে অন্যটিতে যায় না, এটি খালি অ্যারে থেকে পুনর্নির্মাণ।
আমি একবার ভাল্লুক কুস্তি করেছিলাম।

4
@ ডেকেল - ছোট সংস্করণ :)var names = array.reduce(function(a, b) { a.indexOf(b.name) === -1 && a.push(b.name) return a; }, []);
রায়ন

4
@ রেয়ন দয়া করে উত্স কোডের আকারের দিকে খুব বেশি মনোযোগ দেবেন না, এটি অনেকগুলি স্ব-তৈরি প্রোগ্রামারদের জন্য একটি সাধারণ ক্ষতি, সবচেয়ে গুরুত্বপূর্ণ, আপনার প্রোগ্রামটি দক্ষ এবং পাঠযোগ্য হতে হবে।
পাতা

17

ব্যক্তিগতভাবে আমি দেখতে পাচ্ছি না কেন সবাই ইএস with এর সাথে সমস্ত অভিনবতা অর্জন করছে it এটি যদি আমার কোড হয় তবে আমি যতটা সম্ভব ব্রাউজারকে সমর্থন করতে পছন্দ করতাম।

var array=[
{id:123, value:"value1", name:"Name1"},
{id:124, value:"value2", name:"Name1"},
{id:125, value:"value3", name:"Name2"},
{id:126, value:"value4", name:"Name2"}
];

   // Create array of unique names
var a = (function(a){
  for (var i = array.length; i--;)
    if (a.indexOf(array[i].name) < 0) a.push(array[i].name);
  return a;
})([]);

console.log(a);


4
indexOfসারাক্ষণ--এর পরিবর্তে কোনও অভিধানকে অভিধান হিসাবে ব্যবহার করা কি আরও পারফরম্যান্স হবে না? উদাহরণস্বরূপ added[name] = trueএবং এর if(added[name])পরিবর্তে if(a.indexOf(name))
বোজিদার মেরিনভ

7
"ব্যক্তিগতভাবে আমি দেখতে পাচ্ছি না যে সবাই কেন এস with এর সাথে সমস্ত কৌতূহল পাচ্ছে" কেন আপনি একটি আদালত বানাচ্ছেন goto fail, আপনার সূচক পরিবর্তনশীলটিকে ঘেরের ক্ষেত্রের মধ্যে ফাঁস করা ইত্যাদি etc. ইত্যাদি reasons পুরানো ব্রাউজারগুলির জন্য পলফিল / ট্রান্সফর্মের ক্ষেত্রে তুচ্ছভাবে সহজ অংশ।
জ্যারেড স্মিথ

5
আরও পঠনযোগ্য? এটি লুপের জন্য এটি একটি freaking যা অ্যারেগুলিতে আইটেমগুলিকে ঠেলে দেয়। এর চেয়ে বেশি বেশি পঠনযোগ্য আর কিছু পাবে না ......
আমি একবার ভালুক কুস্তি দিয়েছিলাম।

4
বেশ সত্যই বলে মনে হচ্ছে আপনি অভিযোগ করার মতো কিছু খুঁজে পাওয়ার জন্য খুব চেষ্টা করছেন।
আমি একবার ভাল্লুক কুস্তি করেছিলাম।

4
"আমি বিখ্যাত অ্যাপল এসএসএল বাগটি উল্লেখ করছি" - এটি এমন বিখ্যাত নয় যে আপনি কেবল প্রাসঙ্গিকতার বাইরে এলোমেলো মন্তব্যে উল্লেখ করতে পারেন এবং লোকেদের এটি স্বীকৃতি দেবে বলে আশাবাদী।
হিজাজমান

15

আপনি সহজভাবে mapসঙ্গে একত্রিত করতে পারেfilter

var array = [
  {id:123, value:"value1", name:"Name1"},
  {id:124, value:"value2", name:"Name1"},
  {id:125, value:"value3", name:"Name2"},
  {id:126, value:"value4", name:"Name2"}
];

var unique = array
  .map( item => item.name )
  .filter( ( item, idx, arr ) => arr.indexOf( item ) == idx ) 

console.log(unique)


12

অ্যারে.প্রোটোটাইপ.ড্রেস () দিয়ে কীগুলি ধ্বংসাত্মক নামগুলির সাথে পুনরাবৃত্তিযোগ্য ভেরিয়েবলের ফলাফলের থেকে অবজেক্ট.কিজ () ব্যবহার করে অবজেক্ট.কিজ () ব্যবহার করতে পারেন।array

কোড:

const array = [{id:123, value:"value1", name:"Name1"}, {id:124, value:"value2", name:"Name1"}, {id:125, value:"value3", name:"Name2"}, {id:126, value:"value4", name:"Name2"}],
      names = Object.keys(
        array.reduce((a, { name }) => (a[name] = 1, a), {})
      )

console.log(names)


8

অনেক ভাল উত্তর এখানে। আমি আপনাকে অন্য দৃষ্টিকোণ দেওয়ার আশা নিয়ে কিছুটা বৈচিত্র্যের সাথে অবদান রাখতে চাই।

অ্যারেগুলি জাভাস্ক্রিপ্টে অবজেক্ট টাইপের হয়, তাই এগুলি একই সময়ে হ্যাশ হিসাবে ব্যবহার করা যায়। এই কার্যকারিতাটি ব্যবহার করে আমরা ও (এন) সময় জটিলতার সাথে একক হ্রাসকরণের কাজটি করার কাজটি খুব সহজ করতে পারি।

আপনি যদি অ্যারের কীগুলি ব্যতীত অন্য কোনও বৈশিষ্ট্য ধারণ করে আপনার অ্যারে সন্তুষ্ট না হন তবে আপনি পৃথক হ্যাশ অবজেক্ট রাখার বিষয়টিও বিবেচনা করতে পারেন।

var array = [{id:123, value:"value1", name:"Name1"},
             {id:124, value:"value2", name:"Name1"},
             {id:125, value:"value3", name:"Name2"},
             {id:126, value:"value4", name:"Name2"}
            ],
result = array.reduce((p,c) => p[c.name] ? p : (p[c.name] = true, p.push(c.name), p), []);
console.log(result);


এই ইএস 5 সমাধানটিতে ভাল পারফরম্যান্স রয়েছে তবে দুটি উদ্দেশ্যে অ্যারে ব্যবহার করা বিভ্রান্তিকর এবং বিপজ্জনক, যদি নামের একটির মধ্যে কেবল একটি সংখ্যা হয়। আমি স্টাফটি p[c.name]একটি পৃথক বস্তুতে করার oএবং তারপরে এটি পরিত্যাগ করার পরামর্শ দেব ।
জোয়েটউইডেল

7

আমি সম্মত হই যে আপনার যদি কেবল nameমূল্যগুলির প্রয়োজন হয় তবে একটি Setউপায়।

তবে , আপনি যদি nameসম্পত্তির উপর ভিত্তি করে অনন্য অবজেক্টগুলির একটি অ্যারে পেতে চান তবে আমি একটি ব্যবহার করার পরামর্শ দেব Map। একটি মানচিত্র তৈরির একটি দ্রুত উপায়, [key, value]অ্যারেগুলির একটি অ্যারে দ্বারা হয়:

const array = [{ id: 123, value: "value1", name:"Name1" }, { id: 124, value: "value2", name: "Name1" }, { id: 125, value: "value3", name: "Name2" }, { id: 126, value: "value4", name: "Name2" }],
      unique = new Map(array.map(obj => [obj.name, obj]));

// To get the unique objects
const uniques = Array.from(unique.values());

// Get the names like you already did:
console.log("Names:", uniques.map(obj => obj.name));

// If you ever need the complete array of unique objects, you got a ref:
console.log(JSON.stringify(uniques));
.as-console-wrapper { min-height: 100%; }

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



2

ES6 এর সাথে এই কাজটি করা উচিত।

var array=[
    {id:123, value:"value1", name:"Name1"},
    {id:124, value:"value2", name:"Name1"},
    {id:125, value:"value3", name:"Name2"},
    {id:126, value:"value4", name:"Name2"}
];

var set = new Set();

array.forEach((a)=>{
    set.add(a.name);
}); 

console.log(Array.from(set));


11
mapপার্শ্ব প্রতিক্রিয়া নয়, খাঁটি ফাংশন সহ ব্যবহার করার কথা। এটি forEachবা এর জন্য একটি চাকরি হবে reduce
ভিনসেন্ট ভ্যান ডের ওয়েল

1

অ্যান্ডস্কোরজেএস ব্যবহার করে,

array = [{id:123, value:"value1", name:"Name1"}, {id:124, value:"value2", name:"Name1"}, {id:125, value:"value3", name:"Name2"}, {id:126, value:"value4", name:"Name2"}];
get_names =  _.pluck(_.uniq(array, 'name'), 'name')
console.log(get_names)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

`


0

ইএস 5 এ ও ( এন ) পারফরম্যান্সের জন্য অভিধান হিসাবে একটি অবজেক্ট ব্যবহার করুন ।

এটি কেবল তখনই কাজ করবে যদি সমস্ত কীগুলি স্ট্রিং হয়।

var array = [
    {id: 123, value: "value1", name: "Name1"},
    {id: 124, value: "value2", name: "Name1"},
    {id: 125, value: "value3", name: "Name2"},
    {id: 126, value: "value4", name: "Name2"}
];

var allNames = array.map(item => item.name);

var map = {};
allNames.forEach(name => {
  map[name] = true;
});
var uniqueNames = Object.keys(map);

console.log(uniqueNames);

আপনি যদি পছন্দ করেন তবে আপনি একই অভিব্যক্তিটি করতে পারেন:

var uniqueNames = Object.keys(allNames.reduce((m, n) => (m[n] = true, m), {}));

তবে আমি আবশ্যক ফর্মটি পড়া সহজ মনে করি find


আমি স্পষ্টতার জন্য ES6 তীর ফাংশন ব্যবহার করেছি। আপনি যদি সত্যিই কোনও ট্রান্সিলার ছাড়াই ইএস 5 কে লক্ষ্য করে function (item) { return item.name; }
নিচ্ছেন

বিকল্প হিসেবে Object.keys(), এই উত্তর ব্যবহারসমূহ filter()কেবলমাত্র সেই নাম যা এখনো মানচিত্র, যা বেশ মার্জিত সঞ্চিত হয়নি রাখা।
জোয়েটউইডেল


0

আপনি সর্বাধিক সামঞ্জস্যতা চান তবে এর মতো ব্যবহার array#forEach()এবং array#indexOf()পদ্ধতিগুলি , সংক্ষিপ্ত বাক্য গঠন:

const array = [{ id: 123, value: "value1", name:"Name1" }, { id: 124, value: "value2", name: "Name1" }, { id: 125, value: "value3", name: "Name2" }, { id: 126, value: "value4", name: "Name2" }]

// initialize an empty array named names
let names = [];

// iterate through every element of `array` & check if it's 'name' key's value already in names array if not ADD it 
array.forEach(function(element) { if (names.indexOf(element.name) === -1) names.push(element.name) });
// or use tilde like this:
//array.forEach(function(element) { if (~names.indexOf(element.name)) names.push(element.name) });

console.log(names);

যাইহোক, যদি সামঞ্জস্য হয় কোনো সমস্যা হয় না ব্যবহার ECMAScript 6 এর Setবস্তু, array#mapএবং Array.from()এই মত পদ্ধতি:

const array = [{ id: 123, value: "value1", name:"Name1" }, { id: 124, value: "value2", name: "Name1" }, { id: 125, value: "value3", name: "Name2" }, { id: 126, value: "value4", name: "Name2" }];

// iterate through every element from array using map and store it in Set(a Set won't have duplicates) then convert the Set back to Array(using Array.from)
let names = Array.from(new Set(array.map(element => element.name)));

console.log(names);


0

পৃথক খালি অ্যারে ব্যবহার করে আমি এটি করেছি।

var array = [
   {id:123, value:"value1", name:"Name1"},
   {id:124, value:"value2", name:"Name1"},
   {id:125, value:"value3", name:"Name2"},
   {id:126, value:"value4", name:"Name2"}	    
];

var array2 = []		
		
for (i=0; i<array.length;i++){						
   if (array2.indexOf(array[i].name) == -1){				
     array2.push(array[i].name);
    }
}			

console.log(array2)	


-1

1 লাইনার সন্ধানকারীদের জন্য

const names = array.reduce((acc, {name}) => acc.includes(name) ? acc : [name, ...acc], []);

বা অ্যারের প্রোটোটাইপ পদ্ধতি ব্যবহার ছাড়াই

const { reduce, includes } = Array;
const names = reduce(array, (acc, {name}) => includes(acc, name) ? acc : [name, ...acc], []);

এটি ব্যবহারের জন্য কিছু খাঁটি ফাংশন লেখার জন্য দরকারী হতে পারে

const get_uniq_values = (key, arr) => reduce(arr, (a, o) => includes(a, o[key]) ? a : [o[key], ...a], []);

-1
var __array=[{id:123, value:"value1", name:"Name1"},{id:124, value:"value2", name:"Name1"},{id:125, value:"value3", name:"Name2"},{id:126, value:"value4", name:"Name2"}];

function __checkArray(__obj){
    var flag = true;
    for(let i=0; i < __array.length; i++){
        if(__obj.id == __array.id){
            flag = false;
            break;
        }
    }

    return flag;
}

var __valToPush = {id: 127, value: "value5", name: "Name3"};
if(__checkArray(__valToPush)){
    __array.push(__valToPush)
}

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