अंडरस्कोर में किसी विशिष्ट कुंजी मान के साथ किसी ऑब्जेक्ट के सरणी इंडेक्स को ढूंढें


90

अंडरस्कोर में, मैं एक विशिष्ट कुंजी मान के साथ सफलतापूर्वक एक आइटम पा सकता हूं

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

लेकिन मुझे कैसे पता चलेगा कि ऑब्जेक्ट किस एरे इंडेक्स पर हुआ है?



धन्यवाद - यह उपयोगी है - लेकिन सूचीबद्ध उदाहरण में आप संख्याओं की एक सरणी में एक ही संख्या की खोज कर रहे हैं - मैं वस्तुओं की एक सरणी में एक महत्वपूर्ण मूल्य की तलाश कर रहा हूं। क्या यह फ़ंक्शन समायोजित करेगा?
mheavers

2
चाहे उसका सांख्यिक परीक्षण हो या आपकी संपत्ति की समानता, कोई फर्क नहीं पड़ता, हाँ।
बरगी

कोशिश करें 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संपत्ति से अधिक )
स्कॉट जुंगविर्थ

1
प्लक का उपयोग करते हुए बस एक बिंदु इतना धीमा है। मैं इसके अतिरिक्त आघात के कारण। jsperf.com/compare-find-index
Saberi

38

यदि आप अंडरस्कोर के साथ रहना चाहते हैं तो आपका विधेय समारोह अधिक लचीला हो सकता है, यहां 2 विचार हैं।

विधि 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
@AllyssonNunes यह वही है जो मैंने लिखा था - "लो-डैश, जो अंडरस्कोर का विस्तार करता है, ने आईंडेक्स विधि खोजा"
20

3
यह अब मानक अंडरस्कोर लाइब्रेरी का हिस्सा है, संस्करण 1.8.0 के रूप में: underscorejs.org/#1.8.0
Gage Trader

10

यदि आपका लक्षित वातावरण ES2015 का समर्थन करता है (या आपके पास एक ट्रांसपाइल स्टेप है, जैसे कि बैबेल के साथ), तो आप मूल Array.prototype.findIndex () का उपयोग कर सकते हैं।

आपके उदाहरण को देखते हुए

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

Keepin 'यह आसान है:

// 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)

1
बेहतर होगाreturn parseInt(i) for i, x of array when cond(x)
meagar

1
यह पिछले उत्तरों की तुलना में सरल कैसे है ??
नूबिका

2

यह lodashउपयोगकर्ताओं की मदद करना है । जाँच करें कि क्या आपकी कुंजी मौजूद है:

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

1

सबसे आसान उपाय है लश का उपयोग करना:

  1. दर्ज करें:

npm स्थापित - save लॉश

  1. विधि का उपयोग करें खोज:

const _ = आवश्यकता ('लेश');

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>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.