2015-11-11 14 views
16

तो मैं, यह पता लगाने कैसे एक साहचर्य सरणी है कि एक सरणी के तत्व सूचीबद्ध है, और कई बार प्रत्येक तत्व होता है की संख्या उत्पन्न करने के लिए कोशिश कर रहा हूँ जानने के बिना कर रहे हैं तत्व पहले से क्या हैं।एक सरणी में तत्वों की संख्या प्राप्त करने के लिए कैसे, जब तत्वों अज्ञात

उदाहरण के लिए, मान लीजिए कि मैं जानवरों की एक सरणी डालते हैं: var animals = ['Rhino', 'Lion', 'Dog', 'Parrot', 'Parrot', 'Cat', 'Zebra', 'Rhino']

मैं एक वस्तु है कि अंततः लगता है कि उत्पन्न करने के लिए करना चाहते हैं:

{ 'Rhino': 2, 'Lion': 1, 'Dog': 1, 'Parrot': 2, 'Cat': 1, 'Zebra': 1 } 

तो मुझे पता था कि क्या में पशुओं एक वस्तु की तरह मैं चाहता पाने के लिए

var animalsCount = {}; 

var numberOfRhinos = animals.filter(function(animal) { 
    return animal == 'Rhino' 
}).length; 

animalsCount['Rhino'] = numberOfRhinos 

: सरणी पहले से थे, मैं निश्चित रूप से की तरह कुछ कर सकता है। निश्चित रूप से समस्या यह है कि यह जानवरों की संख्या के आधार पर काफी लंबा और दोहराया जाता है। साथ ही, अगर मुझे नहीं पता कि प्रत्येक प्रकार का जानवर क्या है, तो मैं इस तरह वस्तु नहीं बना सकता। उस जानकारी को जानने के बिना ऐसा करने का एक तरीका होना चाहिए, लेकिन मैं अटक गया हूं।

उत्तर

19

सबसे आसान तरीका एक नक्शा बनाने के लिए, मान (1 करने के लिए) है कि नक्शे पर एक एक संपत्ति के रूप में सरणी में आरंभ है। जब भी आप ऐसी संपत्ति देखते हैं जो अपरिभाषित नहीं है, तो आप संपत्ति के मूल्य में वृद्धि कर सकते हैं।

function countObjs(arr) { 
 
     // So the object doesn't inherit from Object.prototype and avoids property 
 
     // name collisions 
 
     var obj = Object.create(null); 
 
     arr.forEach(function(item) { 
 
     if (obj[item]) { 
 
      obj[item]++; 
 
     } else { 
 
      obj[item] = 1; 
 
     } 
 
     }); 
 
     return obj; 
 
    } 
 
    var animals = ['Rhino', 'Lion', 'Dog', 'Parrot', 'Parrot', 'Cat', 'Zebra', 'Rhino']; 
 
    console.log(countObjs(animals)); 
 
    /* 
 
    Cat: 1 
 
    Dog: 1 
 
    Lion: 1 
 
    Parrot: 2 
 
    Rhino: 2 
 
    Zebra: 1 
 
    */

+5

, तो किसी को "misspells" '' constructor' या कुछ और के रूप में constrictor' और चीजें अजीब मिलता है। – user2357112

+0

@ user2357112 मुझे लगता है कि आप विरासत वाले संपत्ति नामों को 'हैऑनप्रॉपर्टी' और 'टूस्ट्रिंग' जैसे संघर्ष करने का जिक्र कर रहे हैं? मैंने 'object.create (null) जोड़ा है; ' –

3

आप सरणी में प्रत्येक तत्व पर पुनरावृति गिनती वस्तु में एक महत्वपूर्ण (साहचर्य सरणियों बुलाया बस जे एस में वस्तु कहा जाता है), यदि कोई मौजूद नहीं है बना सकते हैं और करने के लिए सेट कर सकते हैं 1, या यदि यह मौजूद है तो मान में जोड़ें।

animals.forEach(function(animal){ 
    var count; 

    count = animalsCount[animal]; 

    if (count){ 
    animalsCount[animal] = count + 1; 
    } else { 
    animalsCount[animal] = 1; 
    } 
}) 
+3

को संबोधित करने के लिए मैं' if (animalsCount.hasOwnProperty (animal)) {animalsCount [animal] + = 1 का उपयोग करूंगा; } else {animalsCount [animal] = 1; } 'बदले में। यह बहुत साफ है, और किसी भी स्थानीय चर की आवश्यकता नहीं है। – Toothbrush

5

बस जानवरों को ढीला करके एक शब्दकोश उत्पन्न करें, फिर इसे अपने जानवरों के माध्यम से फिर से लूप करें।

var animals = ['Rhino', 'Lion', 'Dog', 'Parrot', 'Parrot', 'Cat', 'Zebra', 'Rhino']; 
 
    var animals_dict={}; 
 
    for(var i=0;i<animals.length;i++){ 
 
     animals_dict[animals[i]]=0; 
 
    } 
 
    for(var i=0;i<animals.length;i++){ 
 
     animals_dict[animals[i]]=animals_dict[animals[i]]+1; 
 
    } 
 
    alert(JSON.stringify(animals_dict))

1

आप lodash तरह पुस्तकालय का उपयोग कर सकते इस परिणाम प्राप्त करने के लिए।

नहीं तो आप अपने सरणी पुनरावृति कर सकते हैं। देखें कि क्या आपका animalsCount प्रोटोटाइप पशु प्रवेश होता है और बढ़ा देते या मूल्य आरंभ कर देगा।

2

आप आसानी से नीचे के रूप में दो सरणियों में प्राप्त कर सकते हैं।

var animals = ['Rhino', 'Lion', 'Dog', 'Parrot', 'Parrot', 'Cat', 'Zebra', 'Rhino']; 
 

 
function foo(arr) { 
 
    var a = [], 
 
     b = [], 
 
     prev; 
 

 
    arr.sort(); 
 
    for (var i = 0; i < arr.length; i++) { 
 
     if (arr[i] !== prev) { 
 
      a.push(arr[i]); 
 
      b.push(1); 
 
     } else { 
 
      b[b.length - 1]++; 
 
     } 
 
     prev = arr[i]; 
 
    } 
 
    return [a, b]; 
 
} 
 

 
console.log(foo(animals));

अस्वीकरण: उत्पादन सरणी वर्णानुक्रम में क्रमित है। गुणों के साथ सरणी तत्वों से अधिक

+1

आपके पास एक अस्वीकरण होना चाहिए कि आप इसे सॉर्ट करके इनपुट सरणी को संशोधित करने जा रहे हैं। –

4

बस पाश और उन्हें वस्तु में संग्रहीत करते हैं।

var animals = ['Rhino', 'Lion', 'Dog', 'Parrot', 'Parrot','Cat', 'Zebra', 'Rhino']; 
var animalsCount = {}; 

for(var i = animals.length - 1; i >=0; i--) { 
    var count = animalsCount[animals[i]]; 
    if(!count) count = 1; 
    else count++; 
    animalsCount[animals[i]] = count; 
} 

console.log(animalsCount); 
//Outupt {Rhino: 2, Zebra: 1, Cat: 1, Parrot: 2, Dog: 1…} 

//accessing particular animal count 
animalsCount['Cat'];     //outputs 1 
2

countByunderscore में अपनी आवश्यकता को पूरा कर सकते हैं।

_.countBy(animals, function(n) { return n; })

उत्पादन:

{ 'Rhino': 2, 'Lion': 1, 'Dog': 1, 'Parrot': 2, 'Cat': 1, 'Zebra': 1 }

बेशक
संबंधित मुद्दे