জাভাস্ক্রিপ্ট অবজেক্টের একটি অ্যারে আইডি দ্বারা অবজেক্ট সন্ধান করুন


1544

আমি একটি অ্যারে পেয়েছি:

myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}, etc.]

আমি অ্যারের কাঠামো পরিবর্তন করতে অক্ষম। আমি একটি আইডি পাস করছি 45, এবং আমি 'bar'অ্যারেতে এই অবজেক্টটি পেতে চাই ।

আমি জাভাস্ক্রিপ্টে বা jQuery ব্যবহার করে এটি কীভাবে করব?

উত্তর:


1184

find()পদ্ধতিটি ব্যবহার করুন :

myArray.find(x => x.id === '45').foo;

এমডিএন থেকে :

find()পদ্ধতি, অ্যারের মধ্যে প্রথম মান ফেরৎ যদি অ্যারের সন্তুষ্ট মধ্যে একটি উপাদান প্রদান করা পরীক্ষা ফাংশন। অন্যথায় undefinedফেরত দেওয়া হয়।


পরিবর্তে আপনি যদি এর সূচকটি খুঁজতে চান তবে ব্যবহার করুন findIndex():

myArray.findIndex(x => x.id === '45');

এমডিএন থেকে :

findIndex()পদ্ধতি অ্যারের মধ্যে প্রথম উপাদান সূচক ফেরৎ মাফিক টেস্টিং ফাংশন প্রদান করা হয়েছে। অন্যথায় -1 ফেরত দেওয়া হয়।


আপনি যদি মিলের উপাদানগুলির একটি অ্যারে পেতে চান তবে filter()পরিবর্তে পদ্ধতিটি ব্যবহার করুন:

myArray.filter(x => x.id === '45');

এটি বস্তুর একটি অ্যারের ফিরিয়ে দেবে। আপনি যদি কোনও fooবৈশিষ্ট্যের অ্যারে পেতে চান তবে আপনি map()পদ্ধতিটি দিয়ে এটি করতে পারেন :

myArray.filter(x => x.id === '45').map(x => x.foo);

সাইড নোট: মত পদ্ধতি find()বা filter(), এবং তীর ফাংশন পুরোনো ব্রাউজারে (আইই মত) দ্বারা সমর্থিত নয়, তাই আপনি যদি এই ব্রাউজারগুলির সমর্থন করতে চান, আপনি আপনার কোড ব্যবহার transpile উচিত হট্টগোল (সঙ্গে polyfill )।


2
একাধিক পরীক্ষার শর্তগুলির জন্য তাই এটির মতো কিছু হবে: myArray.find (x => x.id === '45' && x.color == 'red')
oo

2
আমার জন্য, এখন পর্যন্ত সেরা উত্তর। জিকুয়ের দরকার নেই তেমনি নতুন সহায়ক অ্যারে তৈরি করা উচিত নয়।
কান্তা

myArray.find (x => x.id === '45') এটি ম্যাক পিসিতে কাজ করে না
গোবিন্দ রাজভার

@ টিজে ক্রাউডার আমি মনে করি না যে এমডিএন থেকে আপনার কোডে পলিফিলগুলি অনুলিপি করা ভাল ধারণা; পরিবর্তে, আপনার পলিফিল সহ এনপিএম প্যাকেজগুলি ব্যবহার করা উচিত। এবং বাবেল ইএস2015 + বৈশিষ্ট্যগুলির জন্য পলফিলগুলি ব্যাবেল -পলিফিল প্যাকেজে অন্তর্ভুক্ত করে।
মিশা পেরেকোভস্কি

2
myArray.find (x => x.id === '45')। ফু; '45' এর আইডি সহ কোনও অবজেক্ট না থাকলে ব্যতিক্রম ছুঁড়ে ফেলে।
ফ্রেজার কির্কম্যান

1465

আপনি যেমন ইতিমধ্যে jQuery ব্যবহার করছেন, আপনি গ্রেপ ফাংশনটি ব্যবহার করতে পারেন যা কোনও অ্যারে অনুসন্ধানের উদ্দেশ্যে করা হয়েছে:

var result = $.grep(myArray, function(e){ return e.id == id; });

ফলাফলটি পাওয়া আইটেমগুলির সাথে একটি অ্যারে। যদি আপনি জানেন যে অবজেক্টটি সর্বদা থাকে এবং এটি কেবল একবার ঘটে তবে আপনি result[0].fooমানটি পেতে কেবল ব্যবহার করতে পারেন। অন্যথায় আপনার ফলাফলের অ্যারের দৈর্ঘ্য পরীক্ষা করা উচিত। উদাহরণ:

if (result.length === 0) {
  // no result found
} else if (result.length === 1) {
  // property found, access the foo property using result[0].foo
} else {
  // multiple items found
}

124
জাভাস্ক্রিপ্ট অপারেটরের সাথে অদ্ভুত সমস্যাগুলি এড়াতে ===পরিবর্তে ব্যবহার করা আরও নিরাপদ । ====
ভিকি চিজওয়ানি

11
@ ভিকিচিজওয়ানি: স্ট্রিংকে স্ট্রিংয়ের সাথে তুলনা করার সময় কি কোনও সমস্যা আছে?
গুফা

38
ওয়েল, যদি তুমি একেবারে উভয় যে নিশ্চিত e.idএবং idস্ট্রিং হতে হবে, আমি এটা ব্যবহার করা ঠিক ঠাউর ==। কিন্তু আপনি যদি নিশ্চিত না হন, আপনি সমস্যার সম্মুখীন হতে পারে (যেহেতু '' == 0হয় trueকিন্তু '' === 0হল false)। উল্লেখ না ===করা দ্রুত বলে মনে হচ্ছে ( স্ট্যাকওভারফ্লো . com / প্রশ্নস / 359494/… )।
ভিকি চিজওয়ানি

101
মূলত আমি সর্বদা ব্যবহার করি ===কারণ এটি অন্যান্য প্রোগ্রামিং ভাষার মতো ঠিক কাজ ==করে। আমি ==জাভাস্ক্রিপ্টে অস্তিত্বহীন বলে বিবেচনা করি ।
ভিকি চিজওয়ানি

6
@de। এখানে অনেক উত্তর অনন্য মূল্যবোধগুলি অনুসন্ধান করার সময় উদ্দেশ্যমূলক আচরণ সরবরাহ করে; আপনি তাদের প্রাথমিকভাবে ফিরে আসুন বা তাদের লুপটি ভেঙে ফেলুন (বা পুনরাবৃত্তি বন্ধের জন্য নিম্ন-স্তরের কন্সট্রাক্টের নির্দেশ দিন) এগুলি দ্বারা আপনি তাদেরকে মূলত সনাক্ত করতে পারেন। ক্যানোনিকাল উদাহরণের জন্য জারেডপারের উত্তর এবং একই অন্তর্দৃষ্টিটির জন্য সেই উত্তরটিতে অ্যারনিয়াসের মন্তব্য দেখুন। সাধারণভাবে, লোকেরা "ফিল্টার" এবং "ফাইন্ড" ফাংশনগুলির মধ্যে এইভাবে পার্থক্য করে তবে পরিভাষা পরিবর্তিত হয়। যদিও আরও দক্ষ, এটি এখনও লিনিয়ার অনুসন্ধান, সুতরাং আপনি যদি একটি হ্যাশ টেবিল ব্যবহার করতে চান তবে অ্যারন ডিগুল্লার উত্তর দেখুন (ইমপ্লিট বিবরণ থেকে সাবধান থাকুন)।
টেন

362

আর একটি সমাধান হ'ল লুচিং অবজেক্ট তৈরি করা:

var lookup = {};
for (var i = 0, len = array.length; i < len; i++) {
    lookup[array[i].id] = array[i];
}

... now you can use lookup[id]...

এটি বিশেষভাবে আকর্ষণীয় যদি আপনার অনেকগুলি অনুসন্ধানের প্রয়োজন হয়।

আইডি এবং অবজেক্টগুলি ভাগ করা হওয়ায় এর বেশি মেমরির প্রয়োজন হবে না।


6
ঠিক আমি খুঁজছেন ছিল কি. মজার বিষয় আমি কীভাবে প্রতিটি সময় লুপ করার চেষ্টা করে এটিকে অতিরিক্ত জটিল করার চেষ্টা করছিলাম, তালিকাটি থেকে প্রতিটি আইটেম সরিয়ে ফেললাম যখন আমি কেবল যখন কাউচডিবি থেকে প্রাপ্ত ডেটাটি পরিবর্তন করতে এবং এটির জন্য দরকারী যে বিন্যাসে রূপান্তরিত করার দরকার পড়েছিলাম চাহিদা. +1 স্যার!
slickplaid

5
এটি স্মার্ট। প্রতিটি ব্যবহারের জন্য অ্যারেটি দেখে অন্যরা কীভাবে নিশ্চিত হয়েছিল তা আমি ভাবতে পারি না।
আলাদীন মেহেদ

4
যতদিন আপনি বৈশিষ্ট্য ক্রম উপর নির্ভর করে না: stackoverflow.com/questions/4886314/...
Marle1

বিরতি ব্যবহার করছে; লুপে একটি ভাল বিকল্প / উন্নতি যদি আপনি জানেন যে কেবল একটি অবজেক্ট খুঁজে পাওয়া যাবে?
irJvV

7
@ আইজেজেভিভি: না, এটি মোটেই বোঝা যায় না। উপরের কোডটি দরকারী যদি আপনার অনেকগুলি লুকআপ করতে হয়। আপনি যদি একবার একবার দেখেন তবে কোনও lookupবস্তু তৈরি করা সময়ের অপচয়।
অ্যারন ডিজুল্লা

174

এর নাম ECMAScript 2015 প্রদান করে খোঁজ () অ্যারে তে পদ্ধতি:

var myArray = [
 {id:1, name:"bob"},
 {id:2, name:"dan"},
 {id:3, name:"barb"},
]

// grab the Array item which matchs the id "2"
var item = myArray.find(item => item.id === 2);

// print
console.log(item.name);

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


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

2
এটি সহজ করা যেতে পারে myArray.find(d=>d.id===45).foo;
শেগি 11

1
@ শেগি বা এমনকি myArray.find(({ id }) => id === 45).foo। তবে এটি একটি পুরানো উত্তর যা ES2015 সিনট্যাক্সের আগে লেখা হয়েছিল যেমনটি এখনকার মতো সমর্থনযোগ্য ছিল। @ গথডোর উত্তর বর্তমানে থ্রেডে সবচেয়ে বেশি আপ টু ডেট।
রোনার বার্গ

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

1
@HerbertPeters আপনি হতে চান নিশ্চিত করুন যে আপনি নাল-যাচাই, যার সত্যিই সহজ হবে সদাই করতে ঐচ্ছিক chaining : myArray.find(d => d.id === 45)?.foo
রোনার বার্গ

141

অ্যান্ডসোর.জেএস এর জন্য একটি দুর্দান্ত পদ্ধতি রয়েছে:

myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'},etc.]
obj = _.find(myArray, function(obj) { return obj.id == '45' })

42
রেকর্ডের জন্য, লো-ড্যাশ (যা প্রায়শই বোঝার চেয়ে আরও বেশি পারফরম্যান্ট ইন্ডসকোরের চেয়ে বেশি) এর একই পদ্ধতি রয়েছে। দস্তাবেজগুলি এখানে: লডাশ.com
ডকস

যদি আপনি কেবলমাত্র একটি অবজেক্টের প্রত্যাশা করছেন, তবে সন্ধানের ব্যবহারটি যেখানে আরও কার্যকর হবে কোনও ফলাফলের সন্ধানের পরে, অনুসন্ধানটি আর এগোবে না।
চিরকাল

_ফাইভারের ডক্স থেকে সর্বদা: "ফাংশনটি কোনও গ্রহণযোগ্য উপাদান খুঁজে পাওয়ার সাথে সাথে ফিরে আসে এবং পুরো তালিকাটি অতিক্রম করে না" "
GijsjanB

129

আমি মনে করি সবচেয়ে সহজ উপায়টি নিম্নলিখিত হবে, তবে এটি ইন্টারনেট এক্সপ্লোরার 8 এ (বা তার আগের) কাজ করবে না:

var result = myArray.filter(function(v) {
    return v.id === '45'; // Filter out the appropriate one
})[0].foo; // Get result and access the foo property

আমি কৌতূহলী, এখানে সাধারণের তুলনায় কোনও পারফরম্যান্স সুবিধা রয়েছে forকি?
ইগোর জিনোভ'য়েভ

@ আইগর জিনোভ'িয়েভ: হ্যাঁ, অবশ্যই ES5 অ্যারে সরঞ্জামগুলির সাথে পারফরম্যান্সের প্রভাব রয়েছে। প্রতিটি উপাদান জন্য একটি পৃথক ফাংশন কার্যকর করা হয়, তাই এটি সরাসরি forলুপের তুলনায় সত্যই দ্রুত হবে না ।
pimvdb

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

আইই 8-র জন্য যদি আপনার সমর্থন প্রয়োজন হয় তবে কেবল এটিকে এখানে রেখে দিন: stackoverflow.com/questions/7153470/…
অ্যাডাম গ্র্যান্ট

এর সাথে কোনও উপাদান না থাকলে এই কোডটি একটি ত্রুটি ফেলবেid
স্টান

71

নিম্নলিখিত চেষ্টা করুন

function findById(source, id) {
  for (var i = 0; i < source.length; i++) {
    if (source[i].id === id) {
      return source[i];
    }
  }
  throw "Couldn't find object with id: " + id;
}

17
এটি তার নিজের উত্তরের যোগ্য ছিল না, তবে আধুনিক ব্রাউজারগুলিতে এই সমাধানটি এইভাবে লেখা যেতে পারে: jsfiddle.net/rwaldron/j3vST
রিক

12
আপনি যদি দক্ষতার দিকে যাচ্ছেন তবে মনে রাখবেন যে ফিল্টার () এর ব্যবহারের তুলনায় এই উদাহরণটি সম্ভবত দ্রুত (রিকের উদাহরণ দেখুন) যেহেতু এটি প্রথম মিলার আইটেমটি খুঁজে পাওয়ার পরে এইটি ফিরে আসে যখন ফিল্টার () একটি সন্ধানের পরেও পুরো অ্যারে দিয়ে চালিয়ে যেতে থাকে ম্যাচ. এই আইটেমটিতে প্রতিটি আইটেমের জন্য কোনও অতিরিক্ত অ্যারে তৈরি করা বা কোনও ফাংশন কল করার জন্যও কোনও খরচ নেই।
অ্যারনিয়াস

3
@ রিক, সেই উত্তরটির সর্বাধিক আকর্ষণীয় জিনিসটি সম্ভবত আপনি জেএসফিডেলের আউটপুট উইন্ডোতে ফায়ারবগ কনসোল যুক্ত করতে পারেন। লগইন করা এবং আউটপুট দেখার জন্য অন্য কাউকে কনসোল খুলতে বলার চেয়ে এটি অনেক ভাল। অসাধারণ!
কাইলমিট

1
যেহেতু এখন পর্যন্ত কোনওরূপ এটি উল্লেখ করা হয়নি, তাই আমি যুক্ত করতে চেয়েছিলাম যে AngularJS- এও একটি ফিল্টার পদ্ধতি রয়েছে।
এানো


44
myArray.filter(function(a){ return a.id == some_id_you_want })[0]

পুরানো ব্রাউজারগুলির জন্য প্লাইফিল: বিকাশকারী.মোজিলা.আর.ইন.ইউএস
জাস্টিন

@ ড্যানিলো আমি কীভাবে নেস্টেড বস্তুর মধ্যে অনুসন্ধান করতে পারি? stackoverflow.com/questions/44550439/...
Valay

31

উপরে FindById ফাংশনের একটি জেনেরিক এবং আরও নমনীয় সংস্করণ:

// array = [{key:value},{key:value}]
function objectFindByKey(array, key, value) {
    for (var i = 0; i < array.length; i++) {
        if (array[i][key] === value) {
            return array[i];
        }
    }
    return null;
}

var array = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
var result_obj = objectFindByKey(array, 'id', '45');

15

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

myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];

var found = $.map(myArray, function(val) {
    return val.id == 45 ? val.foo : null;
});

//found[0] == "bar";

কার্যকারী উদাহরণ: http://jsfiddle.net/hunter/Pxaua/


1
আমি এই বিষয়টি ভুলে গেছি যে jQuery এর mapস্বয়ংক্রিয়ভাবে nullউপাদানগুলি সরায় । এটি আমার কাছে এবং সাধারণ ধারণার জন্য বিভ্রান্তিকর বলে মনে mapহচ্ছে কারণ ফলাফলটি মূল সংগ্রহের একই দৈর্ঘ্যের নয়।
ম্যাক্সআর্ট

14

আপনি ফিল্টার ব্যবহার করতে পারেন,

  function getById(id, myArray) {
    return myArray.filter(function(obj) {
      if(obj.id == id) {
        return obj 
      }
    })[0]
  }

get_my_obj = getById(73, myArray);

1
@ তোবিয়াসবিউভিং - অ্যারে.ফাইন্ড () ব্যবহার করা এটি খুব সরল জেএস এবং প্রথম সন্ধানে থামানো উচিত তাই আরও কার্যকর হবে।
অ্যাড্রিয়ান লিঞ্চ 20

12

এখানে অনেকগুলি সঠিক উত্তর পাওয়া গেলেও, তাদের মধ্যে অনেকেই একবারে একাধিকবার করা হলে এটি অহেতুক ব্যয়বহুল অপারেশন বলে সত্যতা দেখায় না। চরম ক্ষেত্রে এটি বাস্তব পারফরম্যান্স সমস্যার কারণ হতে পারে।

বাস্তব বিশ্বে আপনি যদি প্রচুর আইটেম এবং কর্মক্ষমতা প্রক্রিয়াকরণ করছেন তবে এটি উদ্বেগের বিষয় হিসাবে প্রাথমিকভাবে লুকআপ তৈরি করা আরও দ্রুত:

var items = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];

var lookup = items.reduce((o,i)=>o[i.id]=o,{});

তারপরে আপনি নির্দিষ্ট সময় মতো আইটেমগুলিতে পেতে পারেন:

var bar = o[id];

আপনি অবজেক্টের পরিবর্তে মানচিত্রটিকে চেহারা হিসাবে বিবেচনা করতে পারেন: https://developer.mozilla.org/en/docs/Web/JavaScript/ উল্লেখ / গ্লোবাল_অবজেক্টস / মানচিত্র


11

নেটিভ ব্যবহার Array.reduce

var array = [ {'id':'73' ,'foo':'bar'} , {'id':'45' ,'foo':'bar'} , ];
var id = 73;
var found = array.reduce(function(a, b){
    return (a.id==id && a) || (b.id == id && b)
});

অন্যথায় যদি পাওয়া যায় তবে অবজেক্ট উপাদানটি প্রদান করে false


কেবল একটি নোট, অ্যারে.রেডস আইই 8 এবং এর অধীনে সমর্থিত নয়।
বার্ন_ই 99

7

আপনি যদি একাধিক বার এটি করেন তবে আপনি একটি মানচিত্র সেট করতে পারেন (ES6):

const map = new Map( myArray.map(el => [el.id, el]) );

তারপরে আপনি সহজভাবে এটি করতে পারেন:

map.get(27).foo

6

খাঁটি জাভাস্ক্রিপ্টে আমি এটি সম্পর্কে কীভাবে যাব তা এখানে, সবচেয়ে ন্যূনতম পদ্ধতিতে আমি এটি ECMAScript 3 বা তার পরেও কাজ করতে পারি তা ভাবতে পারি। ম্যাচ পাওয়া মাত্রই এটি ফিরে আসে।

var getKeyValueById = function(array, key, id) {
    var testArray = array.slice(), test;
    while(test = testArray.pop()) {
        if (test.id === id) {
            return test[key];
        }
    }
    // return undefined if no matching id is found in array
    return;
}

var myArray = [{'id':'73', 'foo':'bar'}, {'id':'45', 'foo':'bar'}]
var result = getKeyValueById(myArray, 'foo', '45');

// result is 'bar', obtained from object with id of '45'

5

আরও জেনেরিক এবং সংক্ষিপ্ত

function findFromArray(array,key,value) {
        return array.filter(function (element) {
            return element[key] == value;
        }).shift();
}

আপনার ক্ষেত্রে প্রাক্তন var element = findFromArray(myArray,'id',45)এটি আপনাকে পুরো উপাদানটি দেবে।


4

আপনি http://sugarjs.com/ থেকে চিনিজ চেষ্টা করে দেখতে পারেন

অ্যারেতে এটির খুব মিষ্টি পদ্ধতি রয়েছে .find। সুতরাং আপনি এই জাতীয় উপাদান খুঁজে পেতে পারেন:

array.find( {id: 75} );

আপনি আরও একটি বৈশিষ্ট্য যুক্ত কোনও বস্তুটিকে অন্য "হু-ক্লজ" যুক্ত করতে পাস করতে পারেন।

দ্রষ্টব্য যে সুগারজগুলি দেশীয় বস্তুগুলিকে প্রসারিত করে এবং কিছু লোক এটিকে খুব খারাপ বলে মনে করে ...


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

এই মন্তব্যটি প্রায় 2 বছরের পুরানো এবং আজ আমি বরং যেকোন উপায়ে লোডাশ ব্যবহার করব। তবে আপনি চাইলে চিনিজ ওয়েবসাইটে এই বিষয়ে পড়তে পারেন। তারা আপনার মতে একটি ভাল অবস্থান নিয়েছে: চিন্জস
ডিপফ্লেম


4

গৃহীত উত্তরে বিল্ডিং:

JQuery:

var foo = $.grep(myArray, function(e){ return e.id === foo_id})
myArray.pop(foo)

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

foo = $.grep myArray, (e) -> e.id == foo_id
myArray.pop foo

4

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

কিছু অনুসন্ধানের পরে আমি দেখতে পেলাম যে সহজ কোড সহ হ্যান্ডেল করা সহজ হবে:

কোড:

var items = mydata.filter(function(item){
    return item.word.toLowerCase().startsWith( 'gk );
})

Https://jsfiddle.net/maheshwaghmare/cfx3p40v/4/ দেখুন

20k স্ট্রিং থেকে Serach


3

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

যদি আপনি কেবল তেহ কোডড চান:

function getId(array, id) {
    for (var i = 0, len = array.length; i < len; i++) {
        if (array[i].id === id) {
            return array[i];
        }
    }
    return null; // Nothing found
}

এবং একই জিনিস ECMAScript 5 এর অ্যারে পদ্ধতিগুলি ব্যবহার করে:

function getId(array, id) {
    var obj = array.filter(function (val) {
        return val.id === id;
    });

    // Filter returns an array, and we just want the matching item.
    return obj[0];
}

3

যতক্ষণ না ব্রাউজার ECMA-262 , 5 তম সংস্করণ (ডিসেম্বর 2009) সমর্থন করে, এটি প্রায় এক-লাইনার কাজ করা উচিত:

var bFound = myArray.some(function (obj) {
    return obj.id === 45;
});

2
প্রায়। যদি কোনও উপাদান প্রয়োজনীয় শর্তটি পূরণ করে তবে এটি bFoundকেবল একটি বুলিয়ান true
ম্যাক্সআর্ট

3

অ্যারেগুলির জন্য অন্তর্নির্মিত "ফিল্টার" ফাংশনটি ব্যবহার করে আপনি খাঁটি জাভাস্ক্রিপ্টে এটি করতে পারেন:

Array.prototype.filterObjects = function(key, value) {
    return this.filter(function(x) { return x[key] === value; })
}

সুতরাং এখন কেবল "আইডি" এর স্থলে keyএবং "45" এর জায়গায় পাস করুন valueএবং আপনি 45 এর আইডির সাথে মিলিত পুরো অবজেক্টটি পাবেন So সুতরাং এটি হবে,

myArr.filterObjects("id", "45");

16
আপনার মালিকানাধীন অবজেক্টগুলি সংশোধন করবেন না।
মিশা পেরেকোভস্কি

3

Array.prototype.filter()ফাংশন ব্যবহার করুন ।

ডেমো : https://jsfiddle.net/sumitridhal/r0cz0w5o/4/

তাদেরকে JSON

var jsonObj =[
 {
  "name": "Me",
  "info": {
   "age": "15",
   "favColor": "Green",
   "pets": true
  }
 },
 {
  "name": "Alex",
  "info": {
   "age": "16",
   "favColor": "orange",
   "pets": false
  }
 },
{
  "name": "Kyle",
  "info": {
   "age": "15",
   "favColor": "Blue",
   "pets": false
  }
 }
];

ছাঁকনি

var getPerson = function(name){
    return jsonObj.filter(function(obj) {
      return obj.name === name;
    });
}

আমি কীভাবে নেস্টেড অবজেক্টের মধ্যে সন্ধান করতে পারি? পোষা প্রাণীর মতো = মিথ্যা দুটি বস্তু ফেরত দেওয়া উচিত।
ভালে

নেস্টেড লুপে .filterপদ্ধতিটি ব্যবহার করুন obj.infovar getPerson = function(name){ return jsonObj.filter(function(obj) { return obj.info.filter(function(info) { return pets === false; }); }); }
সুমিত রিধাল

আপনি এসআই 6 স্টাইলটি খুব ইমো ব্যবহার করতে পারেন ... কনট ফিল্টারডাটা = jsonObj.filter (obj => obj.name === 'অ্যালেক্স')
ডাগিকক্রস

3

আমরা Jquery পদ্ধতি ব্যবহার করতে পারেন $.each()/$.grep()

var data= [];
$.each(array,function(i){if(n !== 5 && i > 4){data.push(item)}}

অথবা

var data = $.grep(array, function( n, i ) {
  return ( n !== 5 && i > 4 );
});

ES6 সিনট্যাক্স ব্যবহার করুন:

Array.find, Array.filter, Array.forEach, Array.map

বা ব্যবহার Lodash https://lodash.com/docs/4.17.10#filter , আন্ডারস্কোর https://underscorejs.org/#filter


2

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

	var indexer = {};
	for (var i = 0; i < array.length; i++) {
	    indexer[array[i].id] = parseInt(i);
	}
	
	//Then you can access object properties in your array using 
	array[indexer[id]].property


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

1

ব্যবহার করুন:

var retObj ={};
$.each(ArrayOfObjects, function (index, obj) {

        if (obj.id === '5') { // id.toString() if it is int

            retObj = obj;
            return false;
        }
    });
return retObj;

এটি আইডি দ্বারা একটি বস্তু ফেরত দেওয়া উচিত।


আপনি রিটার্নজেজেজে কোড ব্যবহার করে সংক্ষিপ্ত করতে পারবেন? আইডি === 5? আপত্তি: মিথ্যা; আমি অ্যারেগুলিকে পুনরাবৃত্তি করার জন্য অনেক কিছু পৌঁছেছি।
মার্সেল

@ মার্সেল: এটি কাজ করবে না। মিথ্যা প্রত্যাবর্তনের ফলে লুপটি শেষ হয়ে যাবে, এটি কেবল অ্যারেটির প্রথম আইটেম হলে এটির সন্ধান করবে।
গুফা

1

এই সমাধানটি পাশাপাশি সহায়ক হতে পারে:

Array.prototype.grep = function (key, value) {
    var that = this, ret = [];
    this.forEach(function (elem, index) {
        if (elem[key] === value) {
            ret.push(that[index]);
        }
    });
    return ret.length < 2 ? ret[0] : ret;
};
var bar = myArray.grep("id","45");

আমি এটি ঠিক এর মতো করে দিয়েছি $.grepএবং যদি কোনও বস্তুর সন্ধান হয় তবে ফাংশনটি অ্যারের পরিবর্তে অবজেক্টটি ফিরিয়ে দেবে।


2
আপনার মালিকানাধীন অবজেক্টগুলি সংশোধন করবেন না।
মিশা পেরেকোভস্কি

@ গোথডো আমি সম্মত কেউ না জানলে function will return the object, rather than an arrayভুল হতে পারে তবে আমি মনে করি এটি ব্যবহারকারীদের উপর নির্ভর করে।
সয়াটিয়ান

0

আগ্রাটনের উত্তর থেকে শুরু করে , এটি এমন একটি ফাংশন যা আসলে ওয়ান্ট উপাদানটি (বা nullনা পাওয়া গেলে) প্রদান করে arrayএবং এমন একটি callbackফাংশন দেয় যা "সঠিক" উপাদানটির সত্যবাদী মান দেয়:

function findElement(array, callback) {
    var elem;
    return array.some(function(e) {
        if (callback(e)) {
            elem = e;
            return true;
        }
    }) ? elem : null;
});

কেবল মনে রাখবেন যে এটি IE8- এ স্থানীয়ভাবে কাজ করে না, কারণ এটি সমর্থন করে না some। একটি পলিফিল সরবরাহ করা যেতে পারে, বিকল্পভাবে সবসময় ক্লাসিক forলুপ থাকে:

function findElement(array, callback) {
    for (var i = 0; i < array.length; i++)
        if (callback(array[i])) return array[i];
    return null;
});

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


0

সংক্ষিপ্ততম,

var theAnswerObj = _.findWhere(array, {id : 42});

1
এর জন্য আন্ডারস্কোর লাইব্রেরি ব্যবহার করা দরকার,
ওপির

2
আপনি একবার আন্ডারস্কোর অন্তর্ভুক্ত, এটি একটি সংক্ষিপ্ত উত্তর নয়!
টিম ওগিলভি

-1

Ax: ক্ষেত্র_প্রকার => 2,: ক্ষেত্র => [1,3,4]} হিসাবে অবজেক্টের ফর্ম্যাট সহ অবজেক্টের অ্যারে হতে "অক্ষসংশ্লিষ্টগুলি" বিবেচনা করুন}

function getFieldOptions(axesOptions,choice){
  var fields=[]
  axesOptions.each(function(item){
    if(item.field_type == choice)
        fields= hashToArray(item.fields)
  });
  return fields;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.