2017-11-26 13 views
5

मुझे लगता है कि मैं जो चाहता हूं वह बहुत आसान है लेकिन मुझे वास्तव में सही समाधान नहीं मिल रहा है।एक सरणी का सबसे नज़दीकी छोटा मान

मैं जावास्क्रिप्ट में सरणी के इस प्रकार है:

[0, 38, 136, 202, 261, 399] 

और मैं एक बटन पर क्लिक 0 से 600 से उत्पन्न मूल्य मिलता है। मुझे इस सरणी में निकटतम निचला मूल्य ढूंढना है।

उदाहरण के लिए, यदि उत्पन्न मूल्य 198 है, तो मैं परिणाम के रूप में 136 प्राप्त करना चाहता हूं। तो उत्पन्न मूल्य 300 है, मैं 261 चाहते हैं ... अगर यह 589 है, मैं चाहता हूँ 399 आदि आदि

अब तक, मैं इस कोड के साथ की कोशिश की है:

var theArray = [ 1, 3, 8, 10, 13 ]; 
var goal = 7; 
var closest = null; 

$.each(theArray, function(){ 
    if (closest == null || Math.abs(this - goal) < Math.abs(closest - goal)) { 
     closest = this; 
    } 
}); 

alert(closest); 

लेकिन यह केवल निकटतम रिटर्न मूल्य ... अब मुझे दिए गए नंबर के लिए केवल निकटतम छोटे मूल्य प्राप्त करने की आवश्यकता है ... मैं अपनी आवश्यकताओं के अनुरूप अपने एल्गोरिदम को कैसे सुधार सकता हूं?

धन्यवाद!

+1

आप सरणी हमेशा अनुसार क्रमबद्ध है? –

+0

उल्लेख करने के लिए भूल गए कि हाँ, इसे हमेशा उदाहरण के क्रम में क्रमबद्ध किया जाएगा ;-) – fraxool

+3

'&& लक्ष्य - यह> 0' – fen1x

उत्तर

3

यदि आप सरणी को सॉर्ट किया गया है, और काफी छोटा है, तो आप जो चाहते हैं उसे करने के लिए वास्तव में एक सरल तरीका number > number-in-array तक सरणी पर सरलीकृत हो जाता है और फिर पिछली स्थिति पर नंबर वापस कर देता है।

function getClosestValue(myArray, myValue){ 
    //optional 
    var i = 0; 

    while(myArray[++i] < myValue); 

    return myArray[--i]; 
} 

सम्मान।

+0

क्या आपको 'i' आरंभ करने की आवश्यकता है? –

+0

यदि कोड के किसी भी बिंदु पर 'i' परिभाषित नहीं किया गया है, तो जेएस इसे डिफ़ॉल्ट मान "अपरिभाषित" के साथ प्रारंभ करेगा; फिर, चूंकि आप इसे एक संख्या के रूप में देख रहे हैं, तो यह 0 को डिफ़ॉल्ट मान के रूप में मान लेगा। ध्यान दें कि चूंकि यह '++ i' है (माफ करना मैंने कोड को गलत किया है, मैं इसे ठीक कर रहा हूं), पहली पहुंच 'myArray [1]' पर होगी। यदि आप चाहें तो आप इसे प्रारंभ भी कर सकते हैं, कोई समस्या नहीं है :) –

0

आप Array#some का उपयोग कर सकते हैं और यदि आइटम वांछित मूल्य के बराबर या बराबर है तो बाहर निकलें। अन्यथा वास्तविक मान को वापसी मान के रूप में असाइन करें।

यह प्रस्ताव सॉर्ट किए गए सरणी के लिए काम करता है।

function getClosest(array, value) { 
 
    var closest; 
 
    array.some(function (a) { 
 
     if (a >= value) { 
 
      return true; 
 
     } 
 
     closest = a; 
 
    }); 
 
    return closest; 
 
} 
 

 
var array = [0, 38, 136, 202, 261, 399]; 
 

 
console.log(getClosest(array, 100)); // 38 
 
console.log(getClosest(array, 198)); // 136 
 
console.log(getClosest(array, 300)); // 261 
 
console.log(getClosest(array, 589)); // 399

0

सरणी रिवर्स और प्रयोग find

let arr = [0, 38, 136, 202, 261, 399]; 
 
let val = 300; 
 
let number = arr.reverse().find(e => e <= val); 
 
console.log(number);

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