2013-10-09 7 views
23

लौटाएं मैं एक सरणी में सभी अद्वितीय आइटम खोजने के लिए _underscore.js का उपयोग कर रहा हूं, लेकिन मैं यह नहीं समझ सकता कि वापस लौटाए गए अद्वितीय आइटमों की संख्या कैसे प्राप्त करें।underscore.js वस्तुओं की सरणी में अद्वितीय मान पाएं; अनन्य आइटम और उनकी गिनती

_PERSONARRAY = [{name:"tom",age:7}{name:"john",age:9}{name:"becky",age:2}{name:"sam",age:7}] 

_UNIQUEAGEARRAY = _.chain(_PERSONARRAY).map(function(person) { return person.age }).uniq().value(); 

इस मामले में _UNIQUEAGEARRAY बराबर होगा:

[{uniqueAge:7,numberOfPeople:2}{uniqueAge:9,numberOfPeople:1}{uniqueAge:2,numberOfPeople:1}] 

मदद के लिए धन्यवाद:

[7,9,2] 

क्या मैं वास्तव में लौटे जरूरत की तरह कुछ है। इसके अलावा, मुझे लगता है कि _underscore.js ऐसा करने में जल्दी है ?? अगर यह बेवकूफ धीमा है तो मुझे बताएं क्योंकि मैं अन्य समाधानों के लिए खुला हूं।

उत्तर

17

मुझे लगता है कि आप countBy समारोह के लिए देख रहे:

{"2":1,"7":2,"9":1} 

JSFiddle डेमो: http://jsfiddle.net/4J2SX/

+5

तो फिर तुम बस वस्तु संरचना आप (http://jsfiddle.net पर अद्यतन चाहते थे में इसे पाने के लिए मानचित्र के माध्यम से चला सकते हैं/4 जे 2 एसएक्स/2 /) –

+0

इतना आसान! धन्यवाद दोस्तों! – That1guyoverthr

+0

@ हावर्ड मान लीजिए कि मेरे पास ऑब्जेक्ट्स की यह सरणी है: [{कूपोनिड: 500 लोकेशन: 10}, {कूपोनिड: 600 लोकेशन: 15}, {कूपोनिड: 500 लोकेशन: 10}, {कूपोनिड: 500 लोकेशन: 20}] का उपयोग करना आपके द्वारा दिए गए समाधान, मुझे अद्वितीय कूपन आईडी की एक सरणी मिली है, प्रत्येक अद्वितीय कूपन आईडी के लिए गणना के साथ; यह सबसे संक्षिप्त एवर था जो मुझे बहुत सारी खोज के बाद मिला था; क्या आप कृपया बता सकते हैं कि अब मैं प्रत्येक अद्वितीय कूपोनिड के लिए कैसे प्राप्त कर सकता हूं, कितने अद्वितीय स्थान आईडी? यानी उपरोक्त कूपोनिड 500 में 2 होगा, और कूपोनिड 600 होगा 1. क्या मैं इसे एक अलग प्रश्न के रूप में पोस्ट करूंगा? – Bhargava

1

आप अगर आप चाहते हैं अंडरस्कोर के GroupBy उपयोग कर सकते हैं

_UNIQUEAGEARRAY = _.countBy(_PERSONARRAY, "age"); 

यह परिणाम पैदा करता है (बड़े डेटासेट के लिए एक अच्छा विचार नहीं हो सकता है क्योंकि यह सभी समूहीकृत वस्तुओं की सूची रखता है)

उदाहरण:

var d = _.groupBy(_PERSONARRAY, function(p){ 
    return p.age; 
}); 

आप GroupBy के बाद एक नक्शा करने का प्रयास करें अपने सटीक प्रारूप को यह मैप करने के लिए करना चाहते हैं:

var x = _.map(d, function(people, age) { 
    return {uniqueAge: age, numberOfPeople: people.length}; 
}); 

jsFiddle: http://jsfiddle.net/jsgkC/2/

+0

नोट: समूह द्वारा, गिनती, इंडेक्स सभी आंतरिक रूप से एक ही "समूह" फ़ंक्शन का उपयोग करते हैं, इसलिए मुझे नहीं पता कि कोई प्रदर्शन बिंदु से दूसरे की तुलना में बेहतर है या नहीं। आप यहां एनोटेटेड स्रोत देख सकते हैं: http://underscorejs.org/docs/underscore.html –

67

एक अच्छा समाधान का उपयोग करने के लिए है अंडरस्कोर के वैकल्पिक इटरेटर फ़ंक्शन uniq फ़ंक्शन

_.uniq(personArray, function(person) { return person.age; }); 

डॉक्स: http://underscorejs.org/#uniq

+1

हां, ऐसा करने के लिए बहुत साफ तरीका – 29er

0

groupBy समारोह उपयोगी है।

_personsList = [{name:"anjo",age:5},{name:"george",age:3},{name:"jack",age:5}]; 
_uniqAgeList = _.groupBy(_personsList, "age"); 

उत्पादन का उत्पादन होगा

{ 
    "3":[{"name":"george","age":3}], 
    "5":[{"name":"anjo","age":5},{"name":"jack","age":5}] 
} 

jsfiddle: http://jsfiddle.net/4J2SX/199/

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