কোন অবজেক্ট অ্যারেতে সূচিপত্র পদ্ধতি?


511

কোন অ্যারেতে অবজেক্টস রয়েছে তার সূচক পাওয়ার সেরা পদ্ধতিটি কী?

এই দৃশ্যটি কল্পনা করুন:

var hello = {
    hello: 'world',
    foo: 'bar'
};
var qaz = {
    hello: 'stevie',
    foo: 'baz'
}

var myArray = [];
myArray.push(hello,qaz);

এখন আমি indexOfএই বস্তুটি দেখতে চাই যা কোন helloসম্পত্তি 'stevie'কোনটি, উদাহরণস্বরূপ এটি 1

আমি জাভাস্ক্রিপ্টের সাথে বেশ নবাগত এবং আমি জানি না কোনও সহজ পদ্ধতি আছে কিনা বা এটি করার জন্য আমার নিজের ফাংশনটি তৈরি করা উচিত কিনা।


1
আপনি দুটি বস্তু একত্রিত করতে চান helloএবং qaz?
আর্মিন

না আমি না। আমি অ্যারেতে অবজেক্টের একটি তালিকা রাখতে চাই।
আন্তোনিও লেগুনা

আহ ঠিক আছে! আপনি অ্যারেতে পুরো অবজেক্টের অবস্থান জানতে চান, যার একটি সংজ্ঞায়িত সম্পত্তি রয়েছে।
আরমিন

10
এই সঠিক উত্তরটি দিয়ে এই সঠিক সমস্যাটি সমাধান করার জন্য আমি একটি খুব সাধারণ ক্রিয়া পেয়েছি: var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor); var objectFound = array[elementPos]; [লিঙ্ক] ( স্ট্যাকওভারফ্লো.com / a / 16100446 / 1937255 )
রিক

ES6 অ্যারে.ইন্ডেক্সঅফ গৃহীত উত্তরের চেয়ে ভাল (যদি ES6 আপনার পক্ষে কাজ করে) - নীচের পুরো উদাহরণটি দেখুন
yar1

উত্তর:


1041

আমি মনে করি আপনি মানচিত্রের ফাংশনটি ব্যবহার করে এটি এক লাইনে সমাধান করতে পারবেন :

pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie');

58
এটি সত্যই গ্রহণযোগ্য উত্তর হওয়া উচিত। বেশিরভাগ ব্রাউজারগুলি আজকাল সমর্থন করেArray.prototype.map()
AlbertEngelB

10
এটি আই 8 সমর্থন করে না তবে এটি যদি সমস্যা না হয় তবে এটিই সেরা সমাধান।
আন্তোনিও লেগুনা

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

7
@ ডউগ যদিও আপনার কার্য সম্পাদন সম্পর্কে সত্যই সঠিক, তবে কে ডান মনে মনে এমন একটি অ্যাপ্লিকেশনের জন্য কোডের একটি লাইন প্রতিস্থাপন করবে যা সংজ্ঞায়িত আইও / নেটওয়ার্কের সাথে আবদ্ধ না হওয়া অবধি বাধা দেয় না?
জারেড স্মিথ

6
প্রযুক্তিগতভাবে একটি
মিনিফাইড জেএস ফাইলটিও

371

অ্যারে.প্রোটোটাইপ.ফাইন্ড ইন্ডেক্স আইই (অন্য প্রান্ত) ব্যতীত অন্য সমস্ত ব্রাউজারগুলিতে সমর্থিত। তবে প্রদত্ত পলিফিলটি দুর্দান্ত

var indexOfStevie = myArray.findIndex(i => i.hello === "stevie");

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


সত্যিই একটি সংক্ষিপ্ত উপায় নেই (যখন ডেভসকে আইই 8 সম্পর্কে চিন্তা করতে হয়েছিল) , তবে এখানে একটি সাধারণ সমাধান রয়েছে:

var searchTerm = "stevie",
    index = -1;
for(var i = 0, len = myArray.length; i < len; i++) {
    if (myArray[i].hello === searchTerm) {
        index = i;
        break;
    }
}

বা একটি ফাংশন হিসাবে:

function arrayObjectIndexOf(myArray, searchTerm, property) {
    for(var i = 0, len = myArray.length; i < len; i++) {
        if (myArray[i][property] === searchTerm) return i;
    }
    return -1;
}
arrayObjectIndexOf(arr, "stevie", "hello"); // 1

কিছু নোট:

  1. অ্যারেতে লুপগুলিতে ... ব্যবহার করবেন না
  2. আপনার "সুই" পেয়ে গেলে লুপটি বের হয়ে যায় বা ফাংশন থেকে ফিরে আসার বিষয়ে নিশ্চিত হন
  3. বস্তুর সাম্য নিয়ে সতর্ক থাকুন

উদাহরণ স্বরূপ,

var a = {obj: 0};
var b = [a];
b.indexOf({obj: 0}); // -1 not found

ফাংশনে সার্চটার্মের তুলনা ভুল রয়েছে কারণ এটি সার্চটার্ম হওয়া উচিত :)
আন্তোনিও লেগুনা

একাধিক উপস্থিতি ছিল
জো

3
@ স্টিভেনেট এটি একটি পারফরম্যান্স অনুকূলিত সংস্করণ; অ্যারের দৈর্ঘ্য কেবল একবারই নির্ধারণ করতে হবে (যখন লুপের জন্য ভেরিয়েবলগুলি শুরু করা হয়)। আপনার ক্ষেত্রে, দৈর্ঘ্য প্রতিটি পুনরাবৃত্তি নতুন করে পরীক্ষা করা হয়। এছাড়াও স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ৫৪৪৯৪২৪/২ এবং স্ট্যাকওভারফ্লো. com / প্রশ্নগুলি / ৮৪৪২23১17১/২ দেখুন , তবে যদি পারফরম্যান্স উচ্চ প্রিও না হয় তবে তা আসলেই কিছু যায় আসে না।
loother

1
ভাল উত্তর, তবে আমি কিছু পারফরম্যান্স বেঞ্চমার্কিং করেছি ( jsperf.com/find-index-of-object-in-array-by-contents দেখুন ) এবং খুঁজে পেয়েছি যে এখানে উল্লিখিত ফাংশন ভিত্তিক উত্তরটি দ্বিতীয় সর্বাধিক পারফরম্যান্ট উত্তর বলে মনে হচ্ছে। আরও উত্তেজনাপূর্ণ একমাত্র এটি কেবলমাত্র একটি ক্রিয়াকলাপের পরিবর্তে প্রোটোটাইপের মধ্যে রেখে দেওয়া হবে যা আমার উত্তরে উল্লিখিত হয়েছে ।
ইউনিফোনিক

123

ES2015 এ এটি বেশ সহজ:

myArray.map(x => x.hello).indexOf('stevie')

বা, সম্ভবত বৃহত্তর অ্যারেগুলির জন্য আরও ভাল পারফরম্যান্স সহ:

myArray.findIndex(x => x.hello === 'stevie')


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

জেনে রাখা ভাল, যদি কার্য সম্পাদনের কাজটি হাতের কাজটির জন্য গুরুত্বপূর্ণ হয়। এটি আমার অভিজ্ঞতায় খুব কমই হয় তবে ymmv।
স্টিভ বেনেট

24
var idx = myArray.reduce( function( cur, val, index ){

    if( val.hello === "stevie" && cur === -1 ) {
        return index;
    }
    return cur;

}, -1 );

17

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

var idx = _.chain(myArray).pluck("hello").indexOf("Stevie").value();

1
অ্যারে.প্রোটোটাইপ.ম্যাপ () আইই 9 + এর জন্য সপোর্টড এবং আপনি আইই 8, 7, 6 এর জন্য একটি পলিফিল ব্যবহার করতে পারেন: বিকাশকারী.মোজিলা.আর
জোহান ইছাভারিয়া

1
আপনি একটি পলিফিল ব্যবহার করতে পারেন। । । অথবা আপনি কেবল আন্ডারস্কোর বা লোডাশ ব্যবহার করতে পারেন, যা মূলত এমন পলিফিল যা অন্যান্য গুডির সাথে সংযুক্ত থাকে । আন্ডারস্কোর নিয়ে আপত্তি কী? আকার?
tandrewnichols

আমি সত্যিই অ্যান্ডস্কোর পছন্দ করি, আপনার উত্তরটিও চতুর, তবে আইএমএইচও পাব্লোর উত্তর সবচেয়ে পরিষ্কার।
জোহান এছাওয়ারিয়া

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

chainএখানে অতিশয় হয়। _.pluck(myArray, 'hello').indexOf('stevie')
স্টিভ বেনেট

14

বা প্রোটোটাইপ করুন:

Array.prototype.indexOfObject = function arrayObjectIndexOf(property, value) {
    for (var i = 0, len = this.length; i < len; i++) {
        if (this[i][property] === value) return i;
    }
    return -1;
}

myArr.indexOfObject("name", "stevie");

9
খুব সুবিধাজনক! যদিও আমি প্রোটোটাইপ.ইন্ডেক্সঅফঅবজেক্টটি বেছে নেব যাতে অস্তিত্বের অ্যারে.ইন্ডেক্সঅফ পদ্ধতিতে হস্তক্ষেপ না হয়। Array.prototype.indexOfObject = function(property, value) { for (var i = 0, len = this.length; i < len; i++) { if (this[i][property] === value) return i; } return -1; };
আদম

1
আমি পুরাতন পূর্বেই সঞ্চিত করা হচ্ছে একটি স্ব নির্বাহ অবসান এটা মোড়ানো হবে, লাইন বরাবর প্রতিস্থাপন ফাংশন হচ্ছে কিছু প্রথম লাইন দিয়ে if (typeof property === 'string' || typeof property === 'number' || typeof property === 'boolean') return oldIndexOf(property, value);। এর কারণ এটি কয়েকটি প্রকারের যা অপরিবর্তনীয়। প্রয়োজনে দেশীয় পদ্ধতিতে ফ্যালব্যাক সক্ষম করার জন্য আমি তৃতীয় যুক্তিও বৈশিষ্ট্যযুক্ত করব।
ইসিয়া মিডোস

8

সংক্ষিপ্ত

myArray.indexOf('stevie','hello')

ব্যবহারের ক্ষেত্রে :

  /*****NORMAL****/  
[2,4,5].indexOf(4) ;//OUTPUT 1
 /****COMPLEX*****/
 [{slm:2},{slm:4},{slm:5}].indexOf(4,'slm');//OUTPUT 1
 //OR
 [{slm:2},{slm:4},{slm:5}].indexOf(4,function(e,i){
   return e.slm;
});//OUTPUT 1
/***MORE Complex**/
[{slm:{salat:2}},{slm:{salat:4}},{slm:{salat:5}}].indexOf(4,function(e,i){
   return e.slm.salat;
});//OUTPUT 1

এপিআই:

    Array.prototype.indexOfOld=Array.prototype.indexOf

    Array.prototype.indexOf=function(e,fn){
      if(!fn){return this.indexOfOld(e)}
      else{ 
       if(typeof fn ==='string'){var att=fn;fn=function(e){return e[att];}}
        return this.map(fn).indexOfOld(e);
      }
    };

6

আমি এখানে বিভিন্ন উত্তরের কিছু পারফরম্যান্স টেস্টিং করেছি, যে কেউ এগুলি নিজে চালাতে পারে:

https://jsperf.com/find-index-of-object-in-array-by-contents

Chrome এ আমার প্রাথমিক পরীক্ষার উপর ভিত্তি করে, নিম্নলিখিত পদ্ধতিটি (প্রোটোটাইপের অভ্যন্তরে লুপের জন্য ব্যবহার করা) দ্রুততম:

Array.prototype.indexOfObject = function (property, value) {
    for (var i = 0, len = this.length; i < len; i++) {
        if (this[i][property] === value) return i;
    }
    return -1;
}

myArray.indexOfObject("hello", "stevie");

এই কোডটি নাথান জায়েতার উত্তরের কিছুটা পরিবর্তিত সংস্করণ।

পারফরম্যান্সের মানদণ্ডে আমি এটি চেষ্টা করেছিলাম যে লক্ষ্যটি 1000 বস্তুর অ্যারেটির মাঝখানে (সূচক 500) এবং একেবারে শেষ (সূচী 999), এবং এমনকি যদি আমি অ্যারেতে একেবারে শেষ আইটেম হিসাবে লক্ষ্য রাখি (অর্থ) এটি সন্ধানের আগে অ্যারের প্রতিটি আইটেমটি লুপ করতে হবে) এটি এখনও দ্রুততম শেষ হয়।

কেবলমাত্র শেষ পংক্তির পুনরাবৃত্তি করা দরকার বলে এই সমাধানটি বারবার সম্পাদনের জন্য সর্বাধিক ক্ষুদ্র হয়ে ওঠার সুবিধা রয়েছে:

myArray.indexOfObject("hello", "stevie");

2
আমি আমার নিজের পরীক্ষাগুলির সাথে একটি ঝাঁকুনি ব্যবহার করে এই প্রশ্নের উত্তর পোস্ট করতে যাচ্ছিলাম তবে আপনার উত্তরের জন্য ধন্যবাদ, আমার আর দরকার নেই। আমি কেবল আপনার পরীক্ষাগুলি নিশ্চিত করতে চাই - আমি একই ফলাফল পেয়েছি, তবে whileএকটিটির পরিবর্তে লুপ ব্যবহার করছি forএবং performance.now()। আমি চাই যে এই উত্তরটি আরও উত্সাহিত হয়েছে এবং আমি এটি আগে দেখেছি, এটি আমার কিছুটা সময় বাঁচাতে পারত ...
যিন কোগনিটো

5

আমি বেশ কয়েকটি পদ্ধতির তুলনা করেছি এবং এই সমস্যাটি সমাধানের দ্রুততম পদ্ধতির সাথে ফলাফল পেয়েছি। এটি একটি forলুপ। এটি অন্য যে কোনও পদ্ধতির চেয়ে 5+ গুণ বেশি দ্রুত।

পরীক্ষার পৃষ্ঠাটি এখানে: https://jsbench.me/9hjewv6a98


একটা for-ofলুপ মিস করছি ?
ডগলাস গ্যাসকেল

5

যদিও, এখানে অন্যান্য বেশিরভাগ উত্তর বৈধ। কখনও কখনও, আপনি যেখানে এটি ব্যবহার করবেন তার কাছে কেবল একটি ছোট্ট সাধারণ কার্য সম্পাদন করা ভাল।

// indexOf wrapper for the list of objects
function indexOfbyKey(obj_list, key, value) {
    for (index in obj_list) {
        if (obj_list[index][key] === value) return index;
    }
    return -1;
}
// Find the string in the list (default -1)
var test1 = indexOfbyKey(object_list, 'name', 'Stevie');
var test2 = indexOfbyKey(object_list, 'last_name', 'some other name');

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


4
array.filter(function(item, indx, arr){ return(item.hello === 'stevie'); })[0];

মনে মনে [0]

এটি reduceহিসাবে হিসাবে ব্যবহার করা উপযুক্তAntonio Lagunaএর উত্তরের ।

বংশের জন্য ক্ষমা ...


4

যদি আপনার বস্তু অ্যারের মধ্যে আপনি যে জিনিসটি ব্যবহার করছেন তার একই জিনিস, আপনি অবজেক্টের সূচকটি ঠিক একইভাবে পেতে সক্ষম হবেন যেমন এটি স্ট্রিংয়ের মতো।

var hello = {
    hello: 'world',
    foo: 'bar'
};
var qaz = {
    hello: 'stevie',
    foo: 'baz'
}

var qazCLONE = { // new object instance and same structure
    hello: 'stevie',
    foo: 'baz'
}

var myArray = [hello,qaz];

myArray.indexOf(qaz) // should return 1
myArray.indexOf(qazCLONE) // should return -1

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



3

আপনি যদি কেবল অবস্থানটি খুঁজতে আগ্রহী হন তবে @ পাবলো এর উত্তর দেখুন

pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie');

তবে, আপনি যদি উপাদানটি খুঁজে পাওয়ার অপেক্ষায় থাকেন (যেমন আপনি যদি এটির মতো কিছু করার কথা ভাবছিলেন myArray[pos]) তবে এটি করার জন্য আরও কার্যকর এক-লাইন উপায় রয়েছে filter

element = myArray.filter((e) => e.hello === 'stevie')[0];

সুগন্ধীর ফলাফল দেখুন (42 + 42% অপস / সেকেন্ড): http://jsbench.github.io/#7fa01f89a5dc5cc3bee79abfde80cdb3


2

এই উদাহরণটি দেখুন: http://jsfiddle.net/89C54/

for (i = 0; i < myArray.length; i++) {
    if (myArray[i].hello === 'stevie') {
        alert('position: ' + i);
        return;
    }
}

এটি শূন্যের সাথে গণনা শুরু করে।


2

আমি নীচের কোডটি পরীক্ষা করে একটি জেনেরিক ফাংশন করেছি যে কোনও বস্তুর জন্য কাজ করে

function indexOfExt(list, item) {
    var len = list.length;

    for (var i = 0; i < len; i++) {
        var keys = Object.keys(list[i]);
        var flg = true;
        for (var j = 0; j < keys.length; j++) {
            var value = list[i][keys[j]];
            if (item[keys[j]] !== value) {
                flg = false;
            }
        }
        if (flg == true) {
            return i;
        }
    }
    return -1;
}

var items = [{ "hello": 'world', "foo": 'bar' }];
var selectedItem = { "hello": 'world', "foo": 'bar' };
alert(items.indexOf(selectedItem));
alert(indexOfExt(items, selectedItem));

প্রথম সতর্কতা ফিরে আসবে -1 (যার অর্থ মিলছে না) এবং দ্বিতীয় সতর্কতা 0 (মানে মিল পাওয়া যায়) ফিরে আসবে।


2

আন্ডারস্কোর.জেএস লাইব্রেরি_.findIndex থেকে ব্যবহার করুন

উদাহরণ এখানে _.findIndex([{a:1},{a: 2,c:10},{a: 3}], {a:2,c:10}) //1


অতিরিক্ত লাইব্রেরি থেকে পদ্ধতিগুলি পরামর্শ দেওয়ার ক্ষেত্রে সেগুলি কোথা থেকে এসেছে তা উল্লেখ করা উচিত।
ক্রিকারজার জ্যাক

@ স্টিভ বনেট খুব ভাল ব্যবহার করুন the লাইব্রেরিটির এখন এটি লোডাসে রয়েছে
জুলু

2

ES6 findIndexপদ্ধতিটি ব্যবহার করে , লোটাস বা অন্য কোনও লাইব্রেরি ছাড়াই আপনি লিখতে পারেন:

function deepIndexOf(arr, obj) {
  return arr.findIndex(function (cur) {
    return Object.keys(obj).every(function (key) {
      return obj[key] === cur[key];
    });
  });
}

এটি বস্তুর তাত্ক্ষণিক বৈশিষ্ট্যগুলির তুলনা করবে তবে বৈশিষ্ট্যগুলিতে পুনরাবৃত্তি হবে না।

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

function deepIndexOf(arr, obj) {
  function findIndex = Array.prototype.findIndex || function (pred) {
    for (let i = 0; i < this.length; ++i) {
      if (pred.call(this, this[i], i)) {
        return i;
      }
    }

    return -1;
  }

  return findIndex.call(arr, function (cur) {
    return Object.keys(obj).every(function (key) {
      return obj[key] === cur[key];
    });
  });
}

( এই দ্বিগুণ উপর আমার উত্তর থেকে )


2

আপনি Array.prototype.findIndex()মূলত একটি নেটিভ এবং সুবিধাজনক ফাংশন ব্যবহার করতে পারেন :

FindIndex () পদ্ধতি অ্যারেতে একটি সূচক ফেরত দেয়, যদি অ্যারেতে কোনও উপাদান সরবরাহিত পরীক্ষামূলক ক্রিয়াকে সন্তুষ্ট করে। অন্যথায় -1 ফেরত দেওয়া হয়।

কেবলমাত্র একটি নোট এটি ইন্টারনেট এক্সপ্লোরার, অপেরা এবং সাফারিতে সমর্থিত নয়, তবে আপনি নীচের লিঙ্কটিতে প্রদত্ত একটি পলিফিল ব্যবহার করতে পারেন।

অধিক তথ্য:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex

var hello = {
  hello: 'world',
  foo: 'bar'
};
var qaz = {
  hello: 'stevie',
  foo: 'baz'
}

var myArray = [];
myArray.push(hello, qaz);

var index = myArray.findIndex(function(element, index, array) {
  if (element.hello === 'stevie') {
    return true;
  }
});
alert('stevie is at index: ' + index);


2

@ মনিকা গার্গের উত্তর , আপনি ব্যবহার করতে পারেন findIndex()(একটি পলিফিল রয়েছে অসমর্থিত ব্রাউজারগুলির জন্য )।

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

FindIndex () পদ্ধতি অ্যারেতে একটি সূচক ফেরত দেয়, যদি অ্যারেতে কোনও উপাদান সরবরাহিত পরীক্ষামূলক ক্রিয়াকে সন্তুষ্ট করে। অন্যথায় -1 ফেরত দেওয়া হয়।

উদাহরণ স্বরূপ:

var hello = {
  hello: 'world',
  foo: 'bar'
};
var qaz = {
  hello: 'stevie',
  foo: 'baz'
}

var myArray = [];
myArray.push(hello,qaz);

var index = myArray.findIndex(function(element) {
  return element.hello == 'stevie';
});

alert(index);


পদ্ধতিটি মার্জিত বলে মনে হচ্ছে, তবে এমডিএন অনুসারে কোনও আইই সমর্থন করে না? বিকাশকারী.মোজিলা.আর.ইন
ডকস / ওয়েব / জাভা স্ক্রিপ্ট / রেফারেন্স/…

পলিফিল ব্যবহার করার চেষ্টা করুন (উত্তরের লিঙ্ক)
মোশ ফেউ

1

অ্যারেতে অবজেক্টের সূচকটি খুঁজে পাওয়ার উপায় এটি

    var myArray = [{  hello: 'world',
        foo: 'bar'
    },{
        hello: 'stevie',
        foo: 'baz'
    }];



    for (i = 0; i < myArray.length; i++) {
        if (myArray[i].hello === 'stevie') {
            alert('position: ' + i);
            return;
        }
    }

0

এটি কাস্টম কোড ছাড়াই কাজ করে

var arr, a, found;
arr = [{x: 1, y: 2}];
a = {x: 1, y: 2};
found = JSON.stringify(arr).indexOf(JSON.stringify(a)) > - 1;
// found === true

দ্রষ্টব্য: এটি প্রকৃত সূচক দেয় না, এটি কেবলমাত্র আপনার অবজেক্টের বর্তমান ডেটা কাঠামোতে বিদ্যমান কিনা তা জানায়


1
এটি বৈধ নয় কারণ এটি কোনও সূচক পেতে দেয় না
আন্তোনিও লেগুনা

0

আপনি সহজভাবে ব্যবহার করতে পারেন

const someId = 2;
const array = [{id:1}, {id:2}, {id:3}];
const index = array.reduce((i, item, index) => item.id === someId ? index : i, -1);
alert('someId ' + someId + ' is at index ' + index);

কোন আন্ডারস্কোর নয়, কোনও হ্রাস নয়।


0
var hello = {hello: "world",  foo: "bar"};
var qaz = {hello: "stevie", foo: "baz"};
var myArray = [];
myArray.push(hello,qaz);

function indexOfObject( arr, key, value   ) {
    var j = -1;
    var result = arr.some(function(obj, i) { 
        j++;
        return obj[key] == value;
    })

    if (!result) {
        return -1;
    } else {
        return j;
    };
}

alert(indexOfObject(myArray,"hello","world"));

অ্যারে কিছু পদ্ধতি ব্যবহার করুন।
ব্যবহারকারী3235365

-1

এটি করতে আপনি নিজের প্রোটোটাইপ তৈরি করতে পারেন:

কিছুটা এইরকম:

Array.prototype.indexOfObject = function (object) {
    for (var i = 0; i < this.length; i++) {
        if (JSON.stringify(this[i]) === JSON.stringify(object))
            return i;
    }
}

2
খারাপ অনুশীলন, অবিচ্ছিন্ন এনক্যাপস্যুলেশন: developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/...
HMR

এটি পুনরাবৃত্তভাবে সংজ্ঞায়িত অবজেক্টগুলিকেও ভেঙে ফেলবে।
জোসেফ কোকো

-2

আমি findIndex()পদ্ধতি ব্যবহার করতে পছন্দ করব :

 var index = myArray.findIndex('hello','stevie');

index আপনাকে সূচী নম্বর দেবে।


1
উত্তর, বানান এবং কোড ইন্ডেন্টেশন এবং :) ভুল?
শচীন ভার্মা

1
FindIndex কোনও জাভাস্ক্রিপ্ট স্ট্যান্ডার্ড বাস্তবায়নে নেই। এই জাতীয় পদ্ধতির জন্য আসন্ন (একমা 6) প্রস্তাব রয়েছে, তবে এর স্বাক্ষরটি এর মতো নয়। দয়া করে আপনার অর্থটি (সম্ভবত পদ্ধতির নাম) পরিষ্কার করুন, ফাইন্ড ইন্ডেক্স পদ্ধতির ঘোষণা দিন বা আপনি যে লাইব্রেরিটি ব্যবহার করছেন তা নাম দিন।
সেবাস্তিয়ান এফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.