অ্যারেতে উপাদানগুলির সমস্ত উপস্থিতিগুলির সূচকটি কীভাবে সন্ধান করবেন?


108

আমি একটি জাভাস্ক্রিপ্ট অ্যারেতে একটি উপাদানটির সমস্ত দৃষ্টান্তের সূচকটি খুঁজে বের করার চেষ্টা করছি, "ন্যানো" বলুন।

var Cars = ["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"];

আমি jQuery.inArray , বা অনুরূপ, .indexOf () চেষ্টা করেছিলাম , তবে এটি কেবলমাত্র এলিমেন্টের শেষ উদাহরণটির সূচক দিয়েছে, এই ক্ষেত্রে 5 টি।

আমি এটি সমস্ত দৃষ্টান্তের জন্য কীভাবে পেতে পারি?

উত্তর:


115

.indexOf()পদ্ধতি যে নির্দিষ্ট করে সূচি থেকে অনুসন্ধান শুরু করতে, যাতে আপনি একটি লুপ এটি কল করতে পারেন যে একটি নির্দিষ্ট মান সমস্ত উদাহরণ এটি একটি ঐচ্ছিক দ্বিতীয় প্যারামিটারটি আছে:

function getAllIndexes(arr, val) {
    var indexes = [], i = -1;
    while ((i = arr.indexOf(val, i+1)) != -1){
        indexes.push(i);
    }
    return indexes;
}

var indexes = getAllIndexes(Cars, "Nano");

আপনি কীভাবে সূচকগুলি ব্যবহার করতে চান তা আপনি সত্যিই পরিষ্কার করেন না, সুতরাং আমার ফাংশন এগুলি হিসাবে অ্যারে হিসাবে ফিরিয়ে দেয় (বা মানটি পাওয়া না গেলে খালি অ্যারে প্রদান করে) তবে আপনি পৃথক সূচক মানগুলির সাথে অন্য কিছু করতে পারেন you লুপ ভিতরে।

আপডেট: ভিজিওএন-এর মন্তব্য অনুসারে লুপের জন্য একটি সাধারণ একই কাজ আরও দক্ষতার সাথে সম্পন্ন করবে এবং এটি বোঝা সহজ এবং অতএব বজায় রাখা আরও সহজ:

function getAllIndexes(arr, val) {
    var indexes = [], i;
    for(i = 0; i < arr.length; i++)
        if (arr[i] === val)
            indexes.push(i);
    return indexes;
}

1
এটি forসূচক অ্যারে পপুলেটিং সহ একক লুপের দ্রুত বিকল্প বলে মনে হচ্ছে না ।
ভিজিওন

1
@ ভিসিওএন - হ্যাঁ, অ্যারের উপরে পুনরুক্ত হওয়া লুপের জন্য একটি সমতলও সহজ হবে, তবে যেহেতু ওপি ব্যবহারের চেষ্টা করার কথা উল্লেখ করেছে .indexOf()আমি এটি প্রদর্শন করতে চেয়েছিলাম যে এটি কাজ করতে পারে। (আমার ধারণা, আমি বুঝতে পারি যে ওপি এটি লুপের জন্য কীভাবে এটি করতে পারে তা বুঝতে পারে)) অবশ্যই এটি করার অন্যান্য উপায় রয়েছে, যেমন,Cars.reduce(function(a, v, i) { if (v==="Nano") a.push(i); return a; }, []);
nnnnnn

আমি উত্তর আমেরিকা থেকে এসেছি কারণ আপনি এর indexesপরিবর্তে ব্যবহার করেছেন indices: পি
ক্যাসেল

2
@ 4 ক্যাসল - হা। না আমি নই. "সূচকগুলি" এবং "সূচী" উভয়ই সঠিক এবং আমি দুজনের মধ্যে বিকল্প হতে চাই। আমি কখনই এটিকে আঞ্চলিক উপভাষার জিনিস হিসাবে ভাবিনি। মজাদার.
nnnnnn

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

80

অন্য বিকল্প সমাধানটি হ'ল Array.prototype.reduce():

["Nano","Volvo","BMW","Nano","VW","Nano"].reduce(function(a, e, i) {
    if (e === 'Nano')
        a.push(i);
    return a;
}, []);   // [0, 3, 5]

এনবি: পদ্ধতির জন্য ব্রাউজারের সামঞ্জস্যতা পরীক্ষা করুন reduceএবং প্রয়োজনে পলফিল ব্যবহার করুন ।


2
+1 টি। মজার কাকতালীয়: ঠিক এই সমাধানটির পরামর্শ দেওয়ার জন্য আমি আমার মন্তব্যে আপনার মন্তব্যে আমার উত্তরটি সম্পাদনা করেছি, তখন আমি রিফ্রেশ করে দেখি যে আপনি ইতিমধ্যে কেবলমাত্র একটি ভেরিয়েবলের নামের সাথে একই জিনিসটি কোডড করে রেখেছেন।
nnnnnn

@nnnnnn :)হ্যাঁ, আমি ভেবেছিলাম সম্ভবত reduceএকটি ভাল বিকল্প হতে পারে।
ভিজিওন

26
array.reduce((a, e, i) => (e === value) ? a.concat(i) : a, [])
ইয়াকার্ট

আমি googled contatতুলনায় ধীর push, তাই আমি উত্তর সঙ্গে আছি।
আন্দ্রে এলরিকো

54

অ্যারে.প্রোটোটাইপ.ম্যাপ () এবং অ্যারে.প্রোটোটাইপ.ফিল্টার () ব্যবহার করে অন্য একটি পদ্ধতি :

var indices = array.map((e, i) => e === value ? i : '').filter(String)

3
দুর্দান্ত, এটি কাজ করে। ফিল্টার (স্ট্রিং) এর ভূমিকা কী তা আপনি ব্যাখ্যা করতে পারেন
মুথামিজচেলওয়ান। ভি

2
@Muthu map(…)এর সমতার জন্য প্রতিটি পুনরাবৃত্তির উপর চেক eএবং value। যখন তারা মেলে সূচকটি ফিরে আসে, অন্যথায় একটি খালি স্ট্রিং। এই মিথ্যা মানগুলি থেকে মুক্তি পেতে, filter(String)নিশ্চিত করুন যে ফলাফলটিতে কেবল এমন মান রয়েছে যা স্ট্রিংয়ের ধরণের এবং খালি নয়। filter(String)এ হিসাবে এটিও লেখা যেতে পারে:filter(e => e !== '')
ইয়াকার্ট

3
... বা: String(thing)কোনও স্ট্রিংতে কিছু জোর করে। Array#filterসব মান, যার জন্য শর্ত হল একটি অ্যারের ফেরৎ truthy । যেহেতু খালি স্ট্রিংগুলি মিথ্যা , সেগুলি অ্যারেতে অন্তর্ভুক্ত নয়।
ইয়াকার্ট

আপনার ব্যাখ্যার জন্য আপনাকে ধন্যবাদ, এটি আমার জন্য সত্যই সহায়ক
মুঠামিজচেলওয়ান। ভি

2
আমি যদি কোনও প্রকল্পে এটি দেখি তবে আমি বিভ্রান্ত হব। এটি "ফিল্টার টু স্ট্রিংস" এর মতো পড়ে, অর্থাত যদি এটি স্ট্রিং থাকে তবেই রাখুন। এবং তারপরে ফলাফলযুক্ত অ্যারেটি স্ট্রিং হিসাবে সূচি হবে, সংখ্যা নয়।
মাইকেল পিয়ারসন

14

Es6 শৈলীর সাথে আরও সহজ উপায়।

const indexOfAll = (arr, val) => arr.reduce((acc, el, i) => (el === val ? [...acc, i] : acc), []);


//Examples:
var cars = ["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"];
indexOfAll(cars, "Nano"); //[0, 3, 5]
indexOfAll([1, 2, 3, 1, 2, 3], 1); // [0,3]
indexOfAll([1, 2, 3], 4); // []

12

আপনি উভয় mapএবং এর মাধ্যমে একটি সাধারণ পঠনযোগ্য সমাধান লিখতে পারেন filter:

const nanoIndexes = Cars
  .map((car, i) => car === 'Nano' ? i : -1)
  .filter(index => index !== -1);

সম্পাদনা: আপনার যদি আইই / এজ সমর্থন করার প্রয়োজন না হয় (বা আপনার কোডটি স্থানান্তর করছে), ES2019 আমাদের ফ্ল্যাটম্যাপ দিয়েছে , এটি আপনাকে একটি সাধারণ এক-লাইনারে এটি করতে দেয়:

const nanoIndexes = Cars.flatMap((car, i) => car === 'Nano' ? i : []);

6

দ্রষ্টব্য: MDN একটি সময় লুপ ব্যবহার করে একটি পদ্ধতি দেয় :

var indices = [];
var array = ['a', 'b', 'a', 'c', 'a', 'd'];
var element = 'a';
var idx = array.indexOf(element);
while (idx != -1) {
  indices.push(idx);
  idx = array.indexOf(element, idx + 1);
}

আমি এটি বলব না যে এটি অন্য উত্তরগুলির চেয়ে ভাল। শুধু আকর্ষণীয়.


4

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

আপনি প্রতিটি পদ্ধতি ব্যবহার করতে পারেন।

var Cars = ["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"];

var result = [];

Cars.forEach((car, index) => car === 'Nano' ? result.push(index) : null)

3
const indexes = cars
    .map((car, i) => car === "Nano" ? i : null)
    .filter(i => i !== null)

1
সূচকগুলি শূন্য-ভিত্তিক, সুতরাং প্রথম গাড়িটি ন্যানো হলে এটি ব্যর্থ হবে।
জ্যাক ডেলভেন্থল

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

হ্যাঁ। এগুলি বেশিরভাগ ক্ষেত্রে অতিরিক্ত জটিল। ভাল সংশোধন।
জ্যাক ডেলভেন্থল

2

এটি আমার পক্ষে কাজ করেছে:

let array1 = [5, 12, 8, 130, 44, 12, 45, 12, 56];
let numToFind = 12
let indexesOf12 = [] // the number whose occurrence in the array we want to find

array1.forEach(function(elem, index, array) {
    if (elem === numToFind) {indexesOf12.push(index)}
    return indexesOf12
})

console.log(indexesOf12) // outputs [1, 5, 7]

1

কেবল অন্য পদ্ধতিটি ভাগ করে নেওয়ার জন্য, আপনি ফল অর্জনের জন্য ফাংশন জেনারেটরগুলিও ব্যবহার করতে পারেন :

function findAllIndexOf(target, needle) {
  return [].concat(...(function*(){
    for (var i = 0; i < target.length; i++) if (target[i] === needle) yield [i];
  })());
}

var target = "hellooooo";
var target2 = ['w','o',1,3,'l','o'];

console.log(findAllIndexOf(target, 'o'));
console.log(findAllIndexOf(target2, 'o'));


0

"আরআর [i] == মান" শর্তের মুখোমুখি আমরা প্রত্যেকবার স্ট্যাক এবং "i" স্ট্যাকের মধ্যে ঠেলাতে পারি can

এটা যাচাই কর:

static void getindex(int arr[], int value)
{
    Stack<Integer>st= new Stack<Integer>();
    int n= arr.length;
    for(int i=n-1; i>=0 ;i--)
    {
        if(arr[i]==value)
        {
            st.push(i);
        }
    }   
    while(!st.isEmpty())
    {
        System.out.println(st.peek()+" ");
        st.pop(); 
    }
}

2
প্রশ্নটি ট্যাগ করা হয়েছে javascript, আপনার উত্তরটি কি Javaআমি বিশ্বাস করি?
noggin182

0
["a", "b", "a", "b"]
   .map((val, index) => ({ val, index }))
   .filter(({val, index}) => val === "a")
   .map(({val, index}) => index)

=> [0, 2]

কোডটির জন্য দয়া করে একটি প্রয়োজনীয় ব্যাখ্যা লিখুন বা মন্তব্যগুলি ইনলাইন করুন। বিটিডাব্লু, আপনার সমাধানটি কাজ করেছে তবে এতে 3 টি পুনরাবৃত্তি রয়েছে ...
JustWe

0

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

if (!Array.prototype.filterIndex) {
Array.prototype.filterIndex = function (func, thisArg) {

    'use strict';
    if (!((typeof func === 'Function' || typeof func === 'function') && this))
        throw new TypeError();

    let len = this.length >>> 0,
        res = new Array(len), // preallocate array
        t = this, c = 0, i = -1;

    let kValue;
    if (thisArg === undefined) {
        while (++i !== len) {
            // checks to see if the key was set
            if (i in this) {
                kValue = t[i]; // in case t is changed in callback
                if (func(t[i], i, t)) {
                    res[c++] = i;
                }
            }
        }
    }
    else {
        while (++i !== len) {
            // checks to see if the key was set
            if (i in this) {
                kValue = t[i];
                if (func.call(thisArg, t[i], i, t)) {
                    res[c++] = i;
                }
            }
        }
    }

    res.length = c; // shrink down array to proper size
    return res;
};

}

এটি এর মতো ব্যবহার করুন:

[2,23,1,2,3,4,52,2].filterIndex(element => element === 2)

result: [0, 3, 7]

-1

findIndexকলব্যাক আউটপুট মেলে যা শুধুমাত্র প্রথম সূচক পুনরুদ্ধার। আপনি findIndexesঅ্যারে প্রসারিত করে আপনার নিজের প্রয়োগ করতে পারবেন , তারপরে আপনার অ্যারেগুলি নতুন কাঠামোতে ফেলে দিন।

class EnhancedArray extends Array {
  findIndexes(where) {
    return this.reduce((a, e, i) => (where(e, i) ? a.concat(i) : a), []);
  }
}
   /*----Working with simple data structure (array of numbers) ---*/

//existing array
let myArray = [1, 3, 5, 5, 4, 5];

//cast it :
myArray = new EnhancedArray(...myArray);

//run
console.log(
   myArray.findIndexes((e) => e===5)
)
/*----Working with Array of complex items structure-*/

let arr = [{name: 'Ahmed'}, {name: 'Rami'}, {name: 'Abdennour'}];

arr= new EnhancedArray(...arr);


console.log(
  arr.findIndexes((o) => o.name.startsWith('A'))
)


-1

যদি আপনি আন্ডারস্কোর / লড্যাশ ব্যবহার করার ইচ্ছা করেন তবে আপনি এটি করতে পারেন

var Cars = ["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"];

_.chain(Cars).map((v, i)=> [i, v === "Nano"]).filter(v=>v[1]).map(v=>v[0]).value()

[0, 3, 5]

2
(["Nano", "Volvo", "BMW", "Nano", "VW", "Nano"]).map((v, i)=> [i, v === "Nano"]).filter(v=>v[1]).map(v=>v[0])
এজন্য আপনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.