2015-12-21 12 views
5

मुझे प्रत्येक संख्या के 'वज़न' के आधार पर संख्याओं की एक स्ट्रिंग को सॉर्ट करने के लिए एक फ़ंक्शन बनाना है - 'वज़न' एक साथ जोड़े गए नंबरों के अंक हैं (99 का वजन 18 होगा, 100 का वजन 1, इत्यादि आदि होगा)। इसका मतलब है कि एक स्ट्रिंग "100 54 32 62""100 32 62 54" वापस आ जाएगी।एक सरणी को सॉर्ट करने के तरीके के आधार पर एक सरणी को कैसे सॉर्ट करें? (जावास्क्रिप्ट)

function orderWeight(str) { 
    var arr = str.split(" "); 
    var sortArr = []; 
    arr.forEach(t => sortArr.push(t.split("").map(s => parseInt(s, 10)).reduce(add, 0))); 
} 

जहां add सिर्फ एक सामान्य इसके अलावा समारोह है:

मैं का उपयोग करके इन नंबरों ठीक से वजन की एक सरणी मिल सकती है। उपरोक्त उदाहरण के लिए, sortArr[1, 9, 5, 8] होगा।

स्ट्रिंग arr से मूल संख्याओं की सरणी को सॉर्ट करने का सबसे अच्छा तरीका क्या है, इस पर आधारित है कि संख्या वजन sortArr की नई सरणी कैसे क्रमबद्ध हो जाती है?

धन्यवाद!

उत्तर

4

इस चाल करना चाहिए:

var x = '100 54 32 62'; 

function orderWeight(str) { 
    return str.split(' ').sort(function(a, b) { 
    return (a.split('').reduce(function(p, c) { return +p + +c; })) > (b.split('').reduce(function(p, c) { return +p + +c; })); 
    }).join(' '); 
} 

var result = orderWeight(x); 

आउटपुट:

100 32 62 54 

अद्यतन:

प्रति स्टर्लिंग ने सुझाव दिया है, यहाँ एक ही समारोह लैम्ब्डा प्रारूप में लिखा है।

var x = '100 54 32 62'; 

function orderWeight(str) { 
    return str.split(' ').sort((a, b) => a.split('').reduce((p, c) => +p + +c) > b.split('').reduce((p, c) => +p + +c)).join(' '); 
} 

var result = orderWeight(x); 

नोट: यह मेरा पहला लैम्ब्डा सिंटैक्स का उपयोग जावास्क्रिप्ट लेखन है। सुझाव देने के लिए स्टर्लिंग के लिए धन्यवाद।

+0

एक आकर्षण की तरह काम करता है! धन्यवाद। मुझे और चाहिए रिकर्सन के साथ अभ्यास करें। – joh04667

+0

ओपी जैसे ईएस 6 सिंटैक्स को दिखाने के लिए आपको इसे संपादित करना चाहिए –

+0

@ स्टर्लिंग - मुझे यकीन नहीं है कि आपका क्या मतलब है, कृपया विस्तृत करें ताकि मैं जवाब अपडेट कर सकूं ... धन्यवाद – Will

0

sorting with map के साथ एक समाधान।

function sort(string) { 
 
    var array = string.split(' '), 
 
     mapped = array.map(function (a, i) { 
 
      return { index: i, value: +a.split('').reduce(function (a, b) { return +a + +b; }) }; 
 
     }); 
 
    return mapped.sort(function (a, b) { 
 
     return a.value - b.value; 
 
    }).map(function (a) { 
 
     return array[a.index]; 
 
    }).join(' '); 
 
} 
 

 
document.write('<pre>' + JSON.stringify(sort('100 54 32 62'), 0, 4) + '</pre>');

-1

मैं अनुक्रमित (0..n -1) की एक सरणी के लिए होता है और (वजन सरणी के आधार पर यह सॉर्ट एक तुलना समारोह है कि दिए गए इंडेक्स के लिए वजन तुलना पारित करके मान)। फिर आपके पास इंडेक्स की एक सरणी होगी, जो दिखाती है कि प्रत्येक आइटम कहाँ होना चाहिए (आपके उदाहरण में इंडेक्स सरणी [0, 2, 3, 1] होगी जिसका अर्थ है कि arr [0] पहले होना चाहिए, फिर arr [2] ], आदि। तो अब आप इंडेक्स सरणी का उपयोग करके सॉर्टेड सरणी बना सकते हैं, उदाहरण के लिए [arr [0], arr [2], arr [3], arr [1]]। तो रिकैक करने के लिए: इनपुट सरणी प्राप्त करें , वज़न एरे की गणना करें, इंडेक्स सरणी 0..एन -1 बनाएं, इसे वेट्स एरे के आधार पर सॉर्ट करें, और आखिरकार सॉर्टेड इंडेक्स सरणी के आधार पर आउटपुट सरणी बनाएं।

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