অবজেক্টের অ্যারেতে, কোনও অবজেক্টের সূচি খুঁজে পাওয়ার দ্রুততম উপায় যার বৈশিষ্ট্যগুলি অনুসন্ধানের সাথে মেলে


135

আমি এটি করার একটি দক্ষ উপায় খুঁজতে চেষ্টা করার চেষ্টা করছিলাম, কিন্তু কোথাও পাইনি। আমার কাছে এমন ধরণের অবজেক্টের অ্যারে রয়েছে:

array[i].id = some number;
array[i].name = some name;

আমি যা করতে চাই তা হল আইডি এর সমান, যেখানে উদাহরণস্বরূপ 0,1,2,3 বা 4 এর মধ্যে একটির অবজেক্টের INDEXES সন্ধান করা I আমি মনে করি আমি ঠিক এর মতো কিছু করতে পারলাম:

var indexes = [];
for(i=0; i<array.length; i++) {
  (array[i].id === 0) ? { indexes[0] = i }
  (array[i].id === 1) ? { indexes[1] = i }
  (array[i].id === 2) ? { indexes[2] = i }
  (array[i].id === 3) ? { indexes[3] = i }
  (array[i].id === 4) ? { indexes[4] = i }
}

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

array.indexOf(this.id === 0);

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


1
আপনার যদি একটি সরল পুরানো অ্যারে থাকে তবে আপনি যা করতে পারেন তা পুনরাবৃত্তি। অ্যারেগুলি হ'ল অ্যারে সূচক দ্বারা অর্ডার করা একগুচ্ছ অবজেক্ট।
ডেভ নিউটন

2
আজই এই পোস্টটি জুড়ে আসুন, সমস্ত প্রয়াতদের জন্য Array.prototype.findIndex()ECMAScript 2015 এ একটি নতুন অ্যারে পদ্ধতি রয়েছে The স্বীকৃত উত্তরটি দুর্দান্ত ছিল।
কনরাড লো

আমি ইএস 6 সিনট্যাক্সের ভক্ত (পলিফিল ব্যবহার করুন, যদি লিগ্যাসি ব্রাউজারগুলিতে সমর্থন প্রয়োজন হয়)। ES7 + ES8 ভবিষ্যতে হতে চলেছে
ফ্রি 0 জেনফায়ার

উত্তর:


391

হতে পারে আপনি উচ্চতর অর্ডার ফাংশন যেমন "মানচিত্র" ব্যবহার করতে চান। ধরে নেওয়া হচ্ছে আপনি 'ক্ষেত্র' বৈশিষ্ট্য দ্বারা অনুসন্ধান চান:

var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor);
var objectFound = array[elementPos];

9
এই উত্তরটি মহান, কারণ এটি আসলে সূচক :) প্রদানের মাধ্যমে প্রশ্নের উত্তর হয়
counterbeing

3
@ জিরোঅবসুলিউট আপনার প্রয়োগকৃত ফাংশন (মানচিত্রে পাস করা) একটি হ্যাশ স্ট্রিং ফিরিয়ে দিতে পারে যা আপনার মানদণ্ডের দ্বারা প্রদত্ত প্রতিটি সম্ভাব্য সংমিশ্রণের জন্য একটি অনন্য কী সরবরাহ করতে পারে। উদাহরণস্বরূপ: function hashf(el) { return String(el.id) + "_" + String(el.name); }। এটি কেবল একটি ইঙ্গিত: elementPos = array.map(hashf(x)).indexOf(hash({id:3, name:'Pablo'}));স্পষ্টতই, আমি যে হ্যাশ ফাংশন সরবরাহ করি তা সমস্ত ক্ষেত্রেই কার্যকর নয় কারণ '_'এটি আপনার মানগুলির অংশ তৈরি করতে পারে তবে এটি একটি দ্রুত উদাহরণ যা আপনি বিভিন্ন হ্যাশ পদ্ধতি বের করতে পারেন।
পাবলো ফ্রান্সিসকো পেরেজ

1
যদি এটি না পাওয়া যায় তবে কী ফিরে আসবে? আমি ধরে নিলাম -1, শুধু কৌতূহলী। আমি পরীক্ষা করবো।
নাথান সি। ট্রেশেচ

1
@ নাথানসি.ট্রেশ এটি -1 ফেরত দেয় কারণ এটি indexOfপ্রত্যাবর্তন মান যখন যখন কোনও প্রদত্ত মান সনাক্ত করতে পারে না।
পাবলো ফ্রান্সিসকো পেরেজ

2
সবাইকে হাই দুটি map, indexOfআপনি দুটি পদ্ধতি ব্যবহারের পরিবর্তে কেবল একটি ডাকে ব্যবহার করতে পারেন findIndex....... প্রাক্তন:[{id:1},{id:2},{id:3},{id:4}].findIndex(function(obj){return obj.id == 3}) OR [{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)
উমার আহমেদ

64

অ্যারেতে উপাদান সূচকটি খুঁজে পাওয়ার সহজতম ও সহজ উপায়।

ES5 সিনট্যাক্স: [{id:1},{id:2},{id:3},{id:4}].findIndex(function(obj){return obj.id == 3})

ES6 সিনট্যাক্স: [{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)


4
আমি বিশ্বাস করি এটি সবচেয়ে মার্জিত সমাধান। পিছন উপযুক্ততা সম্পর্কে চিন্তিত তাদের জন্য আপনার জন্য polyfill জানতে পারেন findIndexdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
mrogers

2
আমি আমার ES6 লিঙ্ক সরঞ্জামটিতে একটি সতর্কতা পেয়েছি যে obj.id == 3এখানে ব্যবহৃত অপারেটর অপ্রত্যাশিত ধরণের রূপান্তর ঘটায়, তাই obj.id === 3পরিবর্তে অপারেটরটি ব্যবহার করুন, যা সমান মান এবং প্রকারের জন্য পরীক্ষা করে।
thclark

1
এই উত্তরটি উপরের স্বীকৃত উত্তরের চেয়ে কমপক্ষে 3.5 গুন দ্রুত। var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor);এটি ব্যবহার করে 0.03500000002532033 মিলি সেকেন্ড সময় নেয় এটি ব্যবহার করে 0.00999999747378752 মিলি সেকেন্ড [{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)সময় নেয়।
ওভিডিও রেইনা

1
এটি পুরো অ্যারেটি পুনরাবৃত্তি করে না বলে এই উত্তরটি সবচেয়ে কার্যকর। নির্বাচিত উত্তরটি সম্পূর্ণ অ্যারের মানচিত্র তৈরি করবে এবং তারপরে FindIndex যা একবারে পুরো অ্যারের মাধ্যমে পুনরাবৃত্তি করতে বাধ্য
করুণ

26

নতুন অ্যারে পদ্ধতি। ফিল্টার () এর জন্য ভালভাবে কাজ করবে:

var filteredArray = array.filter(function (element) { 
    return element.id === 0;
});

jQuery এর সাথে এটিও করতে পারে .grep () এর এটিও

সম্পাদনা করুন: এটি উল্লেখযোগ্য যে এই দুটি ফাংশন হুডের নীচে কেবল পুনরাবৃত্তি হয়, তাদের মধ্যে এবং আপনার নিজের ফিল্টার ফাংশনটি ঘূর্ণায়মানের মধ্যে একটি পারফরম্যান্স পারফরম্যান্সের পার্থক্য থাকবে না, তবে কেন চাকাটি পুনরায় উদ্ভাবন করবে।


+1, আমি সবসময় বস্তুগুলিতে এর মতো ফাংশনগুলিতে বিল্ট হওয়া ভুলে যাই।
তেজস

59
এটি কোনও সূচক ফেরত দেয় না।
অ্যাডাম গ্রান্ট

এটি এই নির্দিষ্ট প্রশ্নের উত্তর দেয় না, তবে আমাকে অনেক সাহায্য করুন! ধন্যবাদ!
rochasdv

এটি সূচক ফেরত দেয় না।
ধনী

10

আপনি যদি পারফরম্যান্সের বিষয়ে চিন্তা করেন তবে সন্ধান বা ফিল্টার বা মানচিত্রের সাহায্যে যান না বা উপরের আলোচিত কোনও পদ্ধতির সাথে যান না

এখানে দ্রুততম পদ্ধতিটি প্রদর্শনের একটি উদাহরণ রয়েছে। এখানে প্রকৃত পরীক্ষার লিঙ্ক

সেটআপ ব্লক

var items = []

for(var i = 0; i < 1000; i++) {
    items.push({id: i + 1})
}

var find = 523

দ্রুততম পদ্ধতি

var index = -1
for(var i = 0; i < items.length; i++) {
    if(items[i].id === find) {
        index = i;
        break;
    }
}

ধীর পদ্ধতি

items.findIndex(item => item.id === find)

স্বল্প পদ্ধতি

items.map(item => item.id).indexOf(find);

2
এই তুলনা প্রদানের জন্য ধন্যবাদ! দুর্দান্ত আকর্ষণীয়টি হ'ল কতটা পারফরম্যান্স পরিবর্তিত হয় - যার মধ্যে কোন ব্রাউজার / জাভাস্ক্রিপ্ট ইঞ্জিনটি চালাতে ব্যবহৃত তার উপর নির্ভর করে কোন পদ্ধতিটি দ্রুত পরিবর্তিত হয়।
আইয়েন কলিন্স

1
আমি মনে করি এটি একটি উত্তর হিসাবে চিহ্নিত করা উচিত। এটি দ্রুততম এবং ধীর পথগুলি দেখায়।
পেইনকিলার

আপনার মানদণ্ডে, ব্লক 2 (ফাইন্ড ইন্ডেক্স ব্যবহার করে) আসলে আমার জন্য দ্রুত (মাইক্রোসফ্ট এজ ক্রোমিয়াম 83.0.474.0 এ)
পুনরায়

ব্লক 2 ক্রোমের পাশাপাশি এখন আরও দ্রুত
কোডি মিকল

8
array.forEach(function (elem, i) {  // iterate over all elements of array
    indexes[elem.id] = i;           // take the found id as index for the
});                                 // indexes array and assign i

ফলাফলটি আইডিটির জন্য অনুসন্ধানের তালিকা। প্রদত্ত আইডি দিয়ে আমরা রেকর্ডের সূচক পাই।



6

যেহেতু নিয়মিত অ্যারে ব্যবহার করে কোনও উত্তর নেই find:

var one = {id: 1, name: 'one'};
var two = {id: 2, name:'two'}
var arr = [one, two] 

var found = arr.find((a) => a.id === 2)

found === two // true

arr.indexOf(found) // 1


3

const index = array.findIndex(item => item.id === 'your-id');

এটি আপনাকে আইডি === আপনার আইডি দিয়ে অ্যারে আইটেমের সূচি পেতে হবে

array = [ {id:1}, {id:2} ];

const index = array.findIndex(item => item.id === 2);

console.log(index);


2

আমার কাছে মনে হচ্ছে আপনি পরীক্ষার জন্য কলব্যাক দিয়ে একটি সাধারণ পুনরাবৃত্তি তৈরি করতে পারেন। তাই ভালো:

function findElements(array, predicate)
{
    var matchingIndices = [];

    for(var j = 0; j < array.length; j++)
    {
        if(predicate(array[j]))
           matchingIndices.push(j);
    }

    return matchingIndices;
}

তাহলে আপনি এই মত প্রার্থনা করতে পারে:

var someArray = [
     { id: 1, text: "Hello" },
     { id: 2, text: "World" },
     { id: 3, text: "Sup" },
     { id: 4, text: "Dawg" }
  ];

var matchingIndices = findElements(someArray, function(item)
   {
        return item.id % 2 == 0;
   });

// Should have an array of [1, 3] as the indexes that matched

2

মঙ্গোডিবি এবং রোবমঙ্গোর জন্য তেজসের উত্তরটি মানিয়ে নেওয়া আমার পরিবর্তন হয়েছে

matchingIndices.push(j);

প্রতি

matchingIndices.push(NumberInt(j+1));

2

ES6 mapফাংশন ব্যবহার করে :

let idToFind = 3;
let index = someArray.map(obj => obj.id).indexOf(idToFind);

2

উপরের দুর্দান্ত উত্তরের সমস্ত সংক্ষিপ্তসার এবং সমস্ত সূচিপত্র অনুসন্ধান সম্পর্কিত আমার উত্তরটির অতিরিক্ত কিছু মন্তব্য থেকে এসেছে।

  1. প্রথম ঘটনার সূচকটি ফেরত দিতে।

const array = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 2 }];
const idYourAreLookingFor = 2;

//ES5 
//Output: 1
array.map(function (x) { return x.id; }).indexOf(idYourAreLookingFor);

//ES6 
//Output: 1
array.findIndex(obj => obj.id === idYourAreLookingFor);

  1. হ্রাস ব্যবহার করে সমস্ত উপস্থিতির সূচকের অ্যারেটি ফিরিয়ে আনতে।

const array = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 2 }]
const idYourAreLookingFor = 2;

//ES5
//Output: [1, 4]
array.reduce(function (acc, obj, i) {
  if (obj.id === idYourAreLookingFor)
    acc.push(i);
  return acc;
}, []);

//ES6
//Output: [1, 4]
array.reduce((acc, obj, i) => (obj.id === idYourAreLookingFor) ? acc.concat(i) : acc, [])


0

যেহেতু আমি এখনও মন্তব্য করতে পারি না, উমায়ের আহমেদ যে পদ্ধতি পোস্ট করেছেন তার উপর ভিত্তি করে আমি যে সমাধানটি ব্যবহার করেছি তা আমি প্রদর্শন করতে চাই, তবে আপনি যখন কোনও মানটির পরিবর্তে কোনও কী অনুসন্ধান করতে চান:

[{"a":true}, {"f":true}, {"g":false}]
.findIndex(function(element){return Object.keys(element)[0] == "g"});

আমি বুঝতে পারি যে এটি প্রসারিত প্রশ্নের উত্তর দেয় না, তবে শিরোনামটি প্রতিটি বস্তুর কাছ থেকে কী চেয়েছিল তা নির্দিষ্ট করে না, তাই ভবিষ্যতে অন্যদের কাছে মাথাব্যথা বাঁচাতে আমি বিনীতভাবে এটিকে ভাগ করতে চাই, যদিও আমি এটি অনাস্থার পরে নাও করতে পারি দ্রুত সমাধান।


0

আমি সুপার-অ্যারে নামে একটি ছোট্ট ইউটিলিটি তৈরি করেছি যেখানে আপনি হে (1) জটিলতার সাথে অনন্য সনাক্তকারী দ্বারা অ্যারে আইটেমগুলি অ্যাক্সেস করতে পারবেন। উদাহরণ:

const SuperArray = require('super-array');

const myArray = new SuperArray([
  {id: 'ab1', name: 'John'},
  {id: 'ab2', name: 'Peter'},
]);

console.log(myArray.get('ab1')); // {id: 'ab1', name: 'John'}
console.log(myArray.get('ab2')); // {id: 'ab2', name: 'Peter'}

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

@ মার্তিজনপিটারগুলি আমি এটি কেবল কয়েকটি প্রাসঙ্গিক প্রশ্নে পোস্ট করেছি এবং প্রকল্পটি এমআইটি ফ্রি তাই চুক্তি কী? হতে পারে আপনি কিছুটা বেশি সহনশীল হতে পারেন।
প্যাটটোমা

0
var test = [
  {id:1, test: 1},
  {id:2, test: 2},
  {id:2, test: 2}
];

var result = test.findIndex(findIndex, '2');

console.log(result);

function findIndex(object) {
  return object.id == this;
}

সূচক 1 প্রদান করবে (কেবলমাত্র ES 2016 এর কাজ করে)


0

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

 while(i<myArray.length && myArray[i].data.value!==value){
  i++; 
}
// i now hows the index value for the match. 
 console.log("Index ->",i );
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.