2011-08-27 13 views
6

मैं नामों के लिए स्वत: सुझाव बना रहा हूं। उपयोगकर्ता प्रकार पाठ बॉक्स में, यह सर्वर हिट और यह चलता है:मैं इस पाठ को तेज़ी से कैसे मेल करूं?

var names = [ list of 1000 names ]; //I have a list of 1000 names, this is static. 
var query = 'alex'; 
var matched_names = []; 

//This is when it gets slow.... 
names.forEach(function(name){ 
    if(name.indexOf(query) >= 0){ 
     matched_names.push(name); 
    } 
}); 

return matched_names; 

मैं इस तेजी से कर सकते हैं? मैं Node.js

+0

नोट करें कि आपके कोड है मामला संवेदनशील: 'एलेक्स' 'एलेक्स' से मेल नहीं खाएगा, यह वही हो सकता है जो आप चाहते हैं। – magma

उत्तर

7

का उपयोग कर रहा हूं यदि नाम स्थिर हैं तो इस कोड को क्लाइंट पर ले जाएं और इसे वहां चलाएं। सर्वर पर इस तरह कोड चलाने का एकमात्र कारण यह है कि डेटा स्रोत किसी भी तरह से गतिशील है।

इस तर्क क्लाइंट-साइड को नाटकीय रूप से प्रदर्शन में सुधार होगा।

1

आप शायद, बजाय filter का उपयोग करना चाहिए, एक बात के लिए, क्योंकि यह देशी है:

var names = [ /* list of 1000 names */ ]; 
var query = 'alex'; 
var matched_names = names.filter(function(name) { 
    return name.indexOf(query) > -1; 
}); 
return matched_names; 
1

आप क्रमबद्ध क्रम में नाम की दुकान है, तो आप द्विआधारी खोज हल कर भीतर नामों में से क्षेत्र को खोजने के लिए उपयोग कर सकते हैं ऑर्डर जो उस नाम के टुकड़े से शुरू होता है जिसे उपयोगकर्ता ने अब तक टाइप किया है, सभी नामों को एक-एक करके जांचने के बजाय।

एक अजीब प्रोग्रामिंग भाषा के साथ एक सिस्टम पर, जहां मैं किसी भी स्थिति में अब तक टाइप किए गए सभी मैचों को ढूंढना चाहता था, मुझे http://en.wikipedia.org/wiki/Key_Word_in_Context को पुनर्जीवित करके अधिक कार्यान्वयन प्रयास के लिए संतोषजनक परिणाम नहीं मिला। (एक बार विश्वविद्यालय में मैंने एक भौतिक केडब्ल्यूआईसी इंडेक्स की खोज की, जिसे आईबीएम लाइनप्रिंटर से मुद्रित किया गया था, और फिर इस उद्देश्य के लिए दस्तावेज़ के रूप में बाध्य किया गया।

1

मैं आपको क्लाइंट-साइड पर यह सामान करने और पसंद करने का सुझाव दूंगा (अब के लिए) एक एक फिल्टर/foreach दृष्टिकोण के बजाय पाश जबकि:

var names = [ /* list of 1000 names */ ] 
, query = 'alex' 
, i = names.length 
, matched_names = []; 

while(i--){ 
    if(names[i].indexOf(query) > -1){ 
    matched_names.push(names[i]); 
    } 
} 

return matched_names; 

यह काफी तेज होगा (भले ही फिल्टर/foreach देशी रूप समर्थित हैं) इस बेंचमार्क देखें:। http://jsperf.com/function-loops/4

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