2011-12-29 8 views
7

संभव डुप्लिकेट एक जटिल श्रृंखला पर indexOf का उपयोग कर:
indexOf method in an object array?मुसीबत

मैं एक जावास्क्रिप्ट सरणी जो इस प्रारूप के अनुसार है:

var arrayName = [ 
{id: "a", gender: "man", item: "stuff"}, 
{id: "b", gender: "woman", item: "stuff"}, 
{id: "c", gender: "man", item: "stuff"}, 
{id: "d", gender: "man", item: "stuff"} 
]; 

वहाँ एक रास्ता है कि मैं सरणी में इंडेक्स खोजने के लिए array.indexOf का उपयोग कर सकता हूं, उदाहरण के लिए जब मैं "आईडी" चर जानता हूं।

उदाहरण के लिए मैंने कोशिश की;

var position = arrayName.indexOf("b"); 
arrayName[position].gender = "man" 

फिलहाल मैं इसका उपयोग कर रहा हूं;

for(var i=0; i<arrayName.length; i++) { 
    if(arrayName[i].id == "b"){ 
     arrayName[i].gender = "man"; 
    } 
} 

यह दूसरी तकनीक काम करता है, लेकिन वास्तविक सरणी मैं उपयोग कर रहा हूँ 150 प्रविष्टियों और प्रत्येक प्रविष्टि में 10 आइटम तो यह सभी के माध्यम से पाशन है बहुत बेकार लगता है जब मैं प्रविष्टि मैं संपादित करना चाहते हैं "आईडी" पता है। अगर मैं इसे काम कर सकता हूं तो सूचकांक एक बहुत साफ दृष्टिकोण होगा।

+2

कॉलिंग इंडेक्स एक सरणी पर क्रॉस-ब्राउज़र संगत नहीं है। – erturne

+0

@erturne - आप सही हैं - यह IE8 में भी नहीं है - वाह –

+1

@erturne: यह नहीं है, लेकिन [जैसा मोज़िला डेवलपर नेटवर्क पर बताया गया है] (https://developer.mozilla.org/en/JavaScript/Reference/ Global_Objects/Array/indexOf), इसे पुराने/बहिष्कृत ब्राउज़रों में भी आसानी से कार्यान्वित किया जा सकता है। – Tadeck

उत्तर

18

indexOf पर आपका कॉल स्ट्रिंग b के विरुद्ध आपके सरणी में ऑब्जेक्ट्स की जांच कर रहा है, जो कभी काम नहीं करेगा।

सही आईडी खोजने के लिए सरणी तत्वों के माध्यम से लूपिंग एक साधारण समाधान है।

या, आप अपने खुद के indexOf समारोह बना सकता है:

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

    var arrayName = [ 
     { id: "a", gender: "man", item: "stuff" }, 
     { id: "b", gender: "woman", item: "stuff" }, 
     { id: "c", gender: "man", item: "stuff" }, 
     { id: "d", gender: "man", item: "stuff" }]; 

    var position = arrayName.indexOfId("b"); 

    alert(position); //alerts 1 

यहाँ एक fiddle

संपादित

आप किसी भी संपत्ति के लिए अपने सरणी तत्वों की तुलना करना चाहते हैं, तो यहां आपको है ऐसा करें (ध्यान दें कि मैं एक मनमानी संपत्ति प्राप्त करने के लिए [] वाक्यविन्यास का उपयोग कर रहा हूं)

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

    var position = arrayName.indexOfField("id", "b"); 
    alert(position); //alerts 1 

    position = arrayName.indexOfField("gender", "man"); 
    alert(position); //alerts 0 

या, यदि आप करते हैं सरणी के प्रोटोटाइप के साथ गड़बड़ नहीं करना चाहता है, और आप सुविधाओं का उपयोग पुराने ब्राउज़र में मौजूद नहीं कोई आपत्ति नहीं है, तो आप इस्तेमाल कर सकते हैं सरणी के filter समारोह

var position = arrayName.indexOf(arrayName.filter(function (val) { 
     return val.id === "b"; 
})[0]); 

नोट यह है कि समारोह IE8 में मौजूद नहीं है, और इसलिए इस ब्राउज़र आप shim from MDN

संपादित हड़पने के लिए होगा का समर्थन करने के - उफ़, indexOf नहीं पुराने ब्राउज़र की ओर अनुकूल या तो है।आप कोड के इस दूसरे बिट के लिए चुनते हैं और IE समर्थन करना चाहते थे, तो आप भी आप उपयोग कर indexOf ओवरराइड कर सकते हैं indexOf from here के लिए शिम हड़पने के लिए

+0

धन्यवाद एडम, यही मुझे संदेह है। मैं शायद आगे बढ़ूंगा और आपके प्रोटोटाइप.इंडेक्सऑफआईड तकनीक की विविधता का उपयोग करूंगा क्योंकि इस प्रकार के संपादन काफी आम हैं, इसलिए यह एक एकल प्रोटोटाइप फ़ंक्शन के संदर्भ में क्लीनर होगा। मेरी विविधता शायद: Array.prototype.indexOfId = फ़ंक्शन (चर, मान) { (var i = 0; i Nick

+0

@ user1121506 - यह काम नहीं करेगा - एक और संपादन के लिए खड़े रहें –

+0

@ user1121506 - संपादित - आपकी टिप्पणी में कोड 99.9% सही था, आपको बस थोड़ी सी चिमटा की आवश्यकता थी। –

0

होगा prototype

Array.prototype.indexOf = function(elem) { 
    for (var i = 0; i < this.length; i++){ 
     if (this[i].id === elem) 
      return i; 
    } 
    return -1; 
} 

var arrayName = [ 
{id: "a", gender: "man", item: "stuff"}, 
{id: "b", gender: "woman", item: "stuff"}, 
{id: "c", gender: "man", item: "stuff"}, 
{id: "d", gender: "man", item: "stuff"} 
]; 

alert(arrayName.indexOf("b")); 

बेला: http://jsfiddle.net/r8rp9/1/

1

आप के लिए, आप Array.prototype.filter उपयोग कर सकते हैं का अवसर है, तो:

var arrayName = [ 
    {id: "a", gender: "man", item: "stuff"}, 
    {id: "b", gender: "woman", item: "stuff"}, 
    {id: "c", gender: "man", item: "stuff"}, 
    {id: "d", gender: "man", item: "stuff"} 
]; 

console.log(arrayName.filter(function(i) { 
    return i.id === 'b'; 
})); 

कौन सा होगा जी ive:

[ { id: 'b', gender: 'woman', item: 'stuff' } ] 
+0

यदि मैं इंडेक्स ढूंढना चाहता हूं और तत्व को हटाना चाहता हूं तो क्या होगा? –

+0

बस 'i.id वापस करें! ==' बी ';' इसके बजाए। – NiKo