কীভাবে জাভাস্ক্রিপ্টে তার সম্পত্তি দ্বারা অবজেক্টের সূচক পাবেন?


241

উদাহরণস্বরূপ, আমার আছে:

var Data = [
  { id_list: 1, name: 'Nick', token: '312312' },
  { id_list: 2, name: 'John', token: '123123' },
]

তারপরে, উদাহরণস্বরূপ , আমি এই বিষয়টিকে বাছাই / বিপরীত করতে চাই name। এবং তারপরে আমি এরকম কিছু পেতে চাই:

var Data = [
  { id_list: 2, name: 'John', token: '123123' },
  { id_list: 1, name: 'Nick', token: '312312' },
]

এবং এখন আমি name='John'সম্পত্তি টোকেনের মান পেতে সম্পত্তি সহ অবজেক্টের সূচকটি জানতে চাই ।

আমি কীভাবে সমস্যার সমাধান করব?


সম্পত্তি অনুসন্ধানের আগে আপনি তালিকাটি প্রথমে বাছাই করতে চান কেন?
জেজেজে

জাভাস্ক্রিপ্ট অবজেক্টস {Key:Value}, আমি এটি আপনার জন্য স্থির করেছি।
রকেট হাজমত


আপনি যদি উত্তরগুলির মাধ্যমে স্ক্যান করেন তবে মনে হয় কিছু দেশীয় Dataঅবজেক্ট রয়েছে। এটি নিছক একটি মূলধনযুক্ত পরিবর্তনশীল নাম, যা প্রচলনের বিরোধী। অন্য কেউ যদি এতে বিরক্ত হন তবে আমি এই নামকরণটি ঠিক করার জন্য প্রশ্ন এবং উত্তরগুলিতে সম্পাদনা করব।
রায় প্রিন্স

উত্তর:


170

অন্যান্য উত্তরগুলি যেমন বোঝায়, অ্যারের মাধ্যমে লুপ করা সম্ভবত সেরা উপায়। তবে আমি এটিকে নিজের ফাংশনে রেখে দেব এবং এটিকে আরও বিমূর্ত বলব:

function findWithAttr(array, attr, value) {
    for(var i = 0; i < array.length; i += 1) {
        if(array[i][attr] === value) {
            return i;
        }
    }
    return -1;
}

var Data = [
    {id_list: 2, name: 'John', token: '123123'},
    {id_list: 1, name: 'Nick', token: '312312'}
];

এটির সাহায্যে আপনি কেবল 'জন' রয়েছে এমনটি আবিষ্কার করতে পারবেন না তবে টোকন '312312' রয়েছে এমনটি আবিষ্কার করতে পারেন:

findWithAttr(Data, 'name', 'John'); // returns 0
findWithAttr(Data, 'token', '312312'); // returns 1
findWithAttr(Data, 'id_list', '10'); // returns -1

সম্পাদনা: ফাংশন আপডেট -১ ফেরত আপডেট হয়েছে সুতরাং এটি অ্যারে.প্রোটোটাইপ.ইন্ডেক্সফের মতো একই নির্মাণকে অনুসরণ করে ()


1
একের চেয়ে আরও বেশি গুণমান স্তরের অনুসন্ধানের জন্য এটি প্রসারিত উত্তর যুক্ত করা হয়েছে। এই ক্রিসের জন্য ধন্যবাদ - সত্যই সহায়তা করেছে: ডি
এড শে

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

এটি করবেন না। উচ্চতর অর্ডার ফাংশন কীভাবে ব্যবহার করবেন তা শিখুন এটি করা জিনিসগুলির পুরানো উপায়।
নেতৃত্বে

327

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

আপনার উদাহরণটি হ'ল:

var Data = [
    {id_list:1, name:'Nick',token:'312312'},
    {id_list:2,name:'John',token:'123123'}
]

আপনি করতে পারেন:

var index = Data.map(function(e) { return e.name; }).indexOf('Nick');

Array.prototype.mapআই 7 বা আই 8 তে উপলব্ধ নয়। ES5 সামঞ্জস্য

এবং এটি এখানে ES6 এবং তীর সিনট্যাক্স সহ যা আরও সহজ:

const index = Data.map(e => e.name).indexOf('Nick');

4
আমি যাই হোক না কেন পুরো অ্যারে পুনরাবৃত্তি করতে হবে। প্রথম পদ্ধতির দরকার নেই।
জার্মান অ্যাটানাসিও

1
সহজ, তবে বড় ডেটাসেটগুলি ব্যবহার করার সময় কর্মক্ষমতাটি বিবেচনা করুন
gavioto

1
সত্যিই দুর্দান্ত উত্তর আমাকে এই সমস্যায় সাহায্য করেছে!
নিলালমিচ 14

1
এই সমাধানটি সুন্দর। স্যার আপনার হাজার বছরের মতো বেঁচে থাকুক।
গভীরতর করুন

3
ES6 সংস্করণে একটি মানচিত্র এবং তারপরে সূচিপত্র করার অর্থ এই নয় যে তারা অ্যারের উপরে দু'বার লুপিং করবে। এর পরিবর্তে আপনি findIndex পদ্ধতি আমার উত্তর দেখানো ব্যবহার করা উচিত
silverlight513

209

আপনি যদি ES6 ব্যবহার করে ভাল থাকেন। অ্যারেগুলিতে এখন ফাইন্ড ইন্ডেক্স ফাংশন রয়েছে। যার অর্থ আপনি এরকম কিছু করতে পারেন:

const index = Data.findIndex(item => item.name === 'John');

6
সর্বাধিক প্রত্যক্ষ এবং মার্জিত সমাধানের হাত দিয়ে আমি একটি ছোট তৈরি করব যে ফাইন্ড ইন্ডেক্সটি লোভী নয় - আমার ক্ষেত্রে এটি নিখুঁত ছিল - তবে ব্যবহারকারীরা সচেতন হন যে আপনার যদি সদৃশ মানযুক্ত (যেমন দুটি বস্তু সহ name: John) বস্তু থাকে তবে এটি কেবল ফিরে আসবে প্রথম ম্যাচ
গ্রেডফক্স

অসাধারণ!! ধন্যবাদ.
moreirapontocom

@ গ্রেডফক্স- এর অর্থ আপনি লোভী নন? লোভীর অর্থ আরও ফলাফল এবং ফাইন্ড ইন্ডেক্স কেবল প্রথম ম্যাচটি ফেরত দেয়।
জোস

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

@ গ্রেডফক্স ব্যাখ্যা করার জন্য ধন্যবাদ আমার লোভীর প্রতি আমার রেফারেন্সটি আসলে প্রোগ্রামিং থেকেই ছিল তবে নিয়মিত প্রকাশের সাথে সম্পর্কিত যেখানে লোভী অ লোভীর চেয়ে আরও বেশি চরিত্র গ্রহণ করে! :-)
জোস

28
var index = Data.findIndex(item => item.name == "John")

যা এর সরলিকৃত সংস্করণ:

var index = Data.findIndex(function(item){ return item.name == "John"})

মোজিলা.অর্গ থেকে :

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


2
স্ট্রিং তুলনার জন্য "===" ব্যবহার করুন এটি এই উত্তরে একমাত্র জিনিস অনুপস্থিত।
ব্রুনো টাভারেস

@ ব্রুনো টাভারেস, আপনি কি মনে করেন যে এক্ষেত্রে কোন পরিস্থিতি আলাদা হবে?
এডঙ্ক

1
@ এড্যাঙ্ক যদি ওপি tokenক্ষেত্রের পরিবর্তে ক্ষেত্রটি পরীক্ষা করে nameথাকে তবে সমস্যা হতে পারে, যেমন Data[0].token == 312312মূল্যায়ন করা হয় trueতবে Data[0].token === 321321মূল্যায়ন করতে পারে false
কেম

@edank এই উত্তরে কটাক্ষপাত stackoverflow.com/questions/359494/...
ব্রুনো Tavares

23

আইইয়ের সাথে যদি আপনার সমস্যা হয় তবে আপনি ম্যাপ () ফাংশনটি ব্যবহার করতে পারেন যা 9.0 থেকে সমর্থিত:

var index = Data.map(item => item.name).indexOf("Nick");

1
নীচের উত্তরটি আরও তথ্য সরবরাহ করে এবং আগে পোস্ট করা হয়েছিল।
আলেকজান্ডার

এটি অবশ্যই এটির জন্য সেরা সমাধান।
বেবলিকিস

4

আমার জন্য পরিচিত একমাত্র উপায় সমস্ত অ্যারের মাধ্যমে লুপিং করা:

var index=-1;
for(var i=0;i<Data.length;i++)
  if(Data[i].name==="John"){index=i;break;}

বা ক্ষেত্রে সংবেদনশীল:

var index=-1;
for(var i=0;i<Data.length;i++)
  if(Data[i].name.toLowerCase()==="john"){index=i;break;}

ফলাফলের পরিবর্তনশীল সূচিতে অবজেক্টের সূচি থাকে বা -1 না পাওয়া গেলে।


2

একটি নমুনা উপায়

(function(){
  if (!Array.prototype.indexOfPropertyValue){
    Array.prototype.indexOfPropertyValue = function(prop,value){
      for (var index = 0; index < this.length; index++){
        if (this[index][prop]){
          if (this[index][prop] == value){
            return index;
          }
        }
      }
      return -1;
    }
  }
 })();
 // usage:
 var Data = [
 {id_list:1, name:'Nick',token:'312312'},{id_list:2,name:'John',token:'123123'}];
 Data.indexOfPropertyValue('name','John'); // returns 1 (index of array);
 Data.indexOfPropertyValue('name','Invalid name') // returns -1 (no result);
 var indexOfArray = Data.indexOfPropertyValue('name','John');
 Data[indexOfArray] // returns desired object.

আমার পরিস্থিতিটির জন্য আমাকে এই কাজটি সামান্য পরিবর্তন করতে হয়েছিল - আমি নালার মান সহ একটি সম্পত্তির সূচকের সন্ধান করছিলাম এবং পঞ্চম লাইন এটি সূচকটি ছাড়তে বাধ্য করছিল।
ডেভিড ব্রুনো

1

আপনি আপনার বাছাই করা মেকানিজম সংজ্ঞায়িত করতে প্যারামিটার হিসাবে একটি কাস্টম ফাংশন ব্যবহার করে অ্যারে.সোর্ট ব্যবহার করতে পারেন।

আপনার উদাহরণে এটি দেবে:

var Data = [
    {id_list:1, name:'Nick',token:'312312'},{id_list:2,name:'John',token:'123123'}
]

Data.sort(function(a, b){
    return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
});

alert("First name is : " + Data[0].name); // alerts 'John'
alert("Second name is : " + Data[1].name); // alerts 'Nick'

সাজানোর ক্রিয়াকলাপটি অবশ্যই -1 ফিরে আসবে যদি a খ এর আগে আসে, 1 যদি a এর পরে খ আসে এবং 0 উভয় সমান হয়। অ্যারে বাছাই করার জন্য আপনার বাছাই করা ফাংশনটিতে সঠিক যুক্তিটি সংজ্ঞায়িত করা আপনার উপর নির্ভর করে।

সম্পাদনা: আপনি কোথায় সূচিটি জানতে চান আপনার প্রশ্নের শেষ অংশটি মিস করেছেন। অন্যরা যেমন বলেছে আপনাকে এটি পেতে অ্যারের মধ্য দিয়ে লুপ করতে হবে।


1

কেবল আপনার অ্যারের মধ্য দিয়ে যান এবং অবস্থানটি সন্ধান করুন:

var i = 0;
for(var item in Data) {
    if(Data[item].name == 'John')
        break;
    i++;
}
alert(i);

এটি হওয়া উচিত if(Data[item].name == 'John'), আমি এটি আপনার জন্য স্থির করেছি।
রকেট হাজমাত

এই এক মুহূর্ত আছে। যদি 'খুঁজে পাওয়া যায় না' পরিবর্তনশীল আমি ইতিবাচক সূচক ধারণ করে। এবং পরীক্ষার জন্য 'খুঁজে পাওয়া যায়নি' এর তুলনা করা দরকার যদি i === ডেটা দৈর্ঘ্য
অ্যান্ড্রু ডি

দ্বিতীয় মুহুর্তটি যদি অ্যারেটিতে নন-ইন্ডেক্সার কাস্টম বৈশিষ্ট্য থাকে। উদাহরণস্বরূপ: ভের ডেটা [1,2,3,4,5]; ডেটা [ "পরীক্ষা"] 7897 =; এর আউটপুটটির তুলনা করুন: (ডেটাতে ইন i) সতর্কতা (ডেটা [i]) এর জন্য; এবং (var i = 0; i <ডেটা দৈর্ঘ্য; i ++) সতর্কতা (ডেটা [i]) এর জন্য;
অ্যান্ড্রু ডি


1

আপনি কেন একটি ছোট কাজ ব্যবহার করবেন না?

সূচক হিসাবে নামগুলি সহ একটি নতুন অ্যারে তৈরি করুন। এর পরে সমস্ত অনুসন্ধান সূচী ব্যবহার করবে। সুতরাং, শুধুমাত্র একটি লুপ। এর পরে আপনার সমস্ত উপাদানগুলির মধ্য দিয়ে লুপ করার দরকার নেই!

var Data = [
    {id_list:1, name:'Nick',token:'312312'},{id_list:2,name:'John',token:'123123'}
    ]
var searchArr = []
Data.forEach(function(one){
  searchArr[one.name]=one;
})
console.log(searchArr['Nick'])

http://jsbin.com/xibala/1/edit

সরাসরি উদাহরণ


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

1

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

function findWithAttr(array, attr, value) {
  if (attr.indexOf('.') >= 0) {
    var split = attr.split('.');
    var attr1 = split[0];
    var attr2 = split[1];
    for(var i = 0; i < array.length; i += 1) {
      if(array[i][attr1][attr2] === value) {
        return i;
      }
    }
  } else {
    for(var i = 0; i < array.length; i += 1) {
      if(array[i][attr] === value) {
        return i;
      }
    }
  };
};

আপনি 'attr1.attr2' ফাংশনে পাস করতে পারেন


1

এই সম্পর্কে কি ? :

Data.indexOf(_.find(Data, function(element) {
  return element.name === 'John';
}));

ধরে নিচ্ছি আপনি লোডাশ বা আন্ডারস্কোর ব্যবহার করছেন।


1
var fields = {
teste:
{
    Acess:
    {
        Edit: true,
      View: false

      }
 },
teste1:
{
    Acess:
    {
        Edit: false,
      View: false

      }
  }
};

console.log(find(fields,'teste'));
function find(fields,field){
    for(key in fields){
        if(key == field){
        return true;
    }
}
return false;
}

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


এই উত্তরটি কীভাবে বর্তমান সমস্যা সমাধানে
ওপিকে

@ ρяσѕρєяকে, আপনার পরামর্শের জন্য ধন্যবাদ, আমি ইতিমধ্যে ব্যাখ্যাটি যুক্ত করেছি :)
পেড্রো

1
let indexOf = -1;
let theProperty = "value"
let searchFor = "something";

theArray.every(function (element, index) {

    if (element[theProperty] === searchFor) {
        indexOf = index;
        return false;
    }
    return true;
});

1
collection.findIndex(item => item.value === 'smth') !== -1

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

1

আপনি যদি সম্পত্তি টোকেনের মান পেতে চান তবে আপনি এটিও চেষ্টা করে দেখতে পারেন

    let data=[
      { id_list: 1, name: 'Nick', token: '312312' },
      { id_list: 2, name: 'John', token: '123123' },
    ]

    let resultingToken =  data[_.findKey(data,['name','John'])].token

যেখানে _.ফিন্ডকি একটি লোডাসের কাজ


0

বিকল্প হিসাবে জার্মান অ্যাটানাসিও রুইজের উত্তরের জন্য, আপনি অ্যারে.ম্যাপ () এর পরিবর্তে অ্যারে.রেডুস () ব্যবহার করে ২ য় লুপটি মুছে ফেলতে পারেন;

var Data = [
    { name: 'hypno7oad' }
]
var indexOfTarget = Data.reduce(function (indexOfTarget, element, currentIndex) {
    return (element.name === 'hypno7oad') ? currentIndex : indexOfTarget;
}, -1);

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