আন্ডারস্কোরে একটি নির্দিষ্ট কী মান সহ কোনও বস্তুর অ্যারে সূচকটি সন্ধান করুন


91

আন্ডারস্কোর এ, আমি সাফল্যের সাথে একটি নির্দিষ্ট কী মান সহ একটি আইটেম খুঁজে পেতে পারি

var tv = [{id:1},{id:2}]
var voteID = 2;
var data = _.find(tv, function(voteItem){ return voteItem.id == voteID; });
//data = { id: 2 }

তবে আমি কীভাবে অ্যারে সূচকটি আবিষ্কার করব যা সেই বস্তুটি ঘটেছে?



ধন্যবাদ - এটি দরকারী - তবে তালিকাভুক্ত উদাহরণে আপনি সংখ্যার অ্যারেতে একটি সংখ্যার সন্ধান করছেন - আমি অবজেক্টের অ্যারেতে একটি মূল মান খুঁজছি। এই ফাংশন যে সামঞ্জস্য করা হবে?
মায়াভারগুলি

4
এটি একটি সাংখ্যিক পরীক্ষা বা আপনার সম্পত্তির সাম্যতার পূর্বাভাসের বিষয়টি বিবেচনা করে না, হ্যাঁ।
বার্গি

চেষ্টা করুন findIndex:var dataIndex = _.findIndex(tv, { id: voteID })
টম স্যাডারলন্ড

প্রশ্নের অনুরোধ অনুসারে দয়া করে উত্তরটি গ্রহণ করে বিবেচনা করুন যা একটি অ্যান্ডস্কোর সমাধান দেয়
নাইজেল বি পেক

উত্তর:


28

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

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

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

var data = tv[tv.getIndexBy("id", 2)]


4
কেন একটি return -1;ডিফল্ট না?
রাদু চিরিয়াক

171

findIndex 1.8 এ যুক্ত হয়েছিল:

index = _.findIndex(tv, function(voteItem) { return voteItem.id == voteID })

দেখুন: http://underscorejs.org/#findIndex

বিকল্পভাবে, এটি কাজ করে, যদি আপনি অন্য অস্থায়ী তালিকা তৈরি করতে আপত্তি করেন না:

index = _.indexOf(_.pluck(tv, 'id'), voteId);

দেখুন: http://underscorejs.org/#pluck


আন্ডারস্কোর সম্পর্কে আমি নিশ্চিত নই তবে লোডাসে আপনার কোনও বেনামি ফাংশন প্রয়োজন নেই, কেবল index = _.findIndex(tv, {id: voteID})কাজ করবে, tvসংগ্রহে আরও জটিল মান রয়েছে (কেবলমাত্র একটি idসম্পত্তি ছাড়াও )
স্কট জংউথर्थ

4
প্লাক ব্যবহার করা মাত্র একটি পয়েন্ট এত ধীর। আমি এটি অতিরিক্ত পারাপারের কারণে। jsperf.com/compare-find-index
ফারশিদ সাবেরি

38

আপনি যদি আন্ডারস্কোরের সাথে থাকতে চান তবে আপনার অনুমানের কাজটি আরও নমনীয় হতে পারে, এখানে 2 টি ধারণা রয়েছে are

পদ্ধতি 1

যেহেতু প্রিডিকেট _.findকোনও উপাদানের মান এবং সূচক উভয়ই গ্রহণ করে, তাই আপনি সূচকটি পুনরুদ্ধার করতে পার্শ্ব প্রতিক্রিয়া ব্যবহার করতে পারেন, এটির মতো:

var idx;
_.find(tv, function(voteItem, voteIdx){ 
   if(voteItem.id == voteID){ idx = voteIdx; return true;}; 
});

পদ্ধতি 2

আন্ডারস্কোর উত্সের দিকে তাকানো, এভাবেই _.findবাস্তবায়ন করা হয়:

_.find = _.detect = function(obj, predicate, context) {
  var result;
  any(obj, function(value, index, list) {
    if (predicate.call(context, value, index, list)) {
      result = value;
      return true;
    }
  });
  return result;
};

এই একটি করতে findIndexফাংশন, কেবল লাইন প্রতিস্থাপন result = value;সঙ্গে result = index;এই প্রথম পদ্ধতি হিসাবে একই ধারণা। আমি এটি উল্লেখ করতে এটি অন্তর্ভুক্ত করেছি যে আন্ডারস্কোর পাশাপাশি প্রয়োগ করতে পার্শ্ব প্রতিক্রিয়া ব্যবহার করে _.find


37

লো-ড্যাশ , যা অ্যান্ডস্কোরকে প্রসারিত করে, ফাইন্ড ইন্ডেক্স পদ্ধতি রয়েছে যা কোনও নির্দিষ্ট উদাহরণের সূচক বা কোনও প্রদত্ত শিকারী দ্বারা বা কোনও প্রদত্ত বস্তুর বৈশিষ্ট্য অনুসারে খুঁজে পেতে পারে।

আপনার ক্ষেত্রে, আমি করব:

var index = _.findIndex(tv, { id: voteID });

একবার চেষ্টা করে দেখো.


সন্ধান করুন এটি আন্ডারস্কোর থেকে নয়, লো-ড্যাশ থেকে একটি পদ্ধতি '
ওয়ালিসন নুনস

4
@ ওয়ালিসন নুনস এটিই আমি লিখেছিলাম - "লো-ড্যাশ, যা অ্যান্ডস্কোরকে প্রসারিত করে, তার মধ্যে ফাইন্ড ইন্ডেক্স পদ্ধতি রয়েছে"
স্প্লিন্টর

4
এই এখন মানক আন্ডারস্কোর লাইব্রেরির অংশ, সংস্করণ 1.8.0 এর হিসাবে underscorejs.org/#1.8.0
Gage ট্রেডার

10

যদি আপনার টার্গেট এনভায়রনমেন্ট ES2015 সমর্থন করে (বা আপনার ট্রাইপাইল স্টেপ রয়েছে, যেমন বাবেলের সাথে), আপনি আদি অ্যারে.প্রোটোটাইপ.ফাইন্ড ইন্ডেক্স () ব্যবহার করতে পারেন।

আপনার উদাহরণ দেওয়া

const array = [ {id:1}, {id:2} ]
const desiredId = 2;
const index = array.findIndex(obj => obj.id === desiredId);

4

আপনি indexOfথেকে পদ্ধতি ব্যবহার করতে পারেনlodash

var tv = [{id:1},{id:2}]
var voteID = 2;
var data = _.find(tv, function(voteItem){ return voteItem.id == voteID; });
var index=_.indexOf(tv,data);

3

এটি সহজ রাখুন:

// Find the index of the first element in array
// meeting specified condition.
//
var findIndex = function(arr, cond) {
  var i, x;
  for (i in arr) {
    x = arr[i];
    if (cond(x)) return parseInt(i);
  }
};

var idIsTwo = function(x) { return x.id == 2 }
var tv = [ {id: 1}, {id: 2} ]
var i = findIndex(tv, idIsTwo) // 1

অথবা, অ-বিদ্বেষীদের জন্য, কফিস্ক্রিপ্ট বৈকল্পিক:

findIndex = (arr, cond) ->
  for i, x of arr
    return parseInt(i) if cond(x)

4
আরও ভাল হবেreturn parseInt(i) for i, x of array when cond(x)
মেগার

4
এটি পূর্বের উত্তরের তুলনায় কীভাবে সহজ ??
ncubica

2

এটি lodashব্যবহারকারীদের সহায়তা করার জন্য । আপনার কীটি করে উপস্থিত রয়েছে কিনা তা পরীক্ষা করুন:

hideSelectedCompany(yourKey) {
 return _.findIndex(yourArray, n => n === yourKey) === -1;
}

1

সহজ সমাধানটি হ'ল লোডাশ ব্যবহার করা:

  1. লড্যাশ ইনস্টল করুন:

এনপিএম ইনস্টল - সেভ লোডাশ

  1. পদ্ধতি ফাইন্ড ইন্ডেক্স ব্যবহার করুন:

কনস্ট _ = প্রয়োজন ('লোডাশ');

findIndexByElementKeyValue = (elementKeyValue) => {
  return _.findIndex(array, arrayItem => arrayItem.keyelementKeyValue);
}

0

আপনি যদি একাধিক ম্যাচ প্রত্যাশা করেন এবং তাই ফেরত দেওয়ার জন্য একটি অ্যারের প্রয়োজন হয়, চেষ্টা করুন:

_.where(Users, {age: 24})

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

_.findWhere(Users, {_id: 10})


0

আমি অনুরূপ কেস পেয়েছি কিন্তু বিপরীতে একটি প্রদত্ত বস্তুর সূচকের ভিত্তিতে ব্যবহৃত কীটি সন্ধান করা। আমি ঘটনার সূচক পেতে কোনও অ্যারেতে অবজেক্টটি ফেরত ব্যবহার করে আন্ডারস্কোরটিতে সমাধান পেতে পারি Object.values

var tv = {id1:1,id2:2};
var voteIndex = 1;
console.log(_.findKey(tv, function(item) {
  return _.indexOf(Object.values(tv), item) == voteIndex;
}));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>

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