2017-04-12 74 views
0

我找不到如何根據JavaScript數組來確定元素屬於哪個區間。我想要Python中的bisect.bisect_left的行爲。這裏是一些示例代碼:JavaScript的等價於R的findInterval()或Python的bisect.bisect_left

import bisect 
a = [10,20,30,40] 
print(bisect.bisect_left(a,0)) #0 because 0 <= 10 
print(bisect.bisect_left(a,10)) #0 because 10 <= 10 
print(bisect.bisect_left(a,15)) #1 because 10 < 15 < 20 
print(bisect.bisect_left(a,25)) #2 ... 
print(bisect.bisect_left(a,35)) #3 ... 
print(bisect.bisect_left(a,45)) #4 

我知道這很容易實現,但爲什麼重新發明輪子?

+2

_「爲什麼重新發明輪子?」 - 也許「輪子」還不存在;) –

回答

2

在JavaScript中沒有內置的平分函數,所以你將不得不推出自己的。這是我個人的車輪再造:

var array = [10, 20, 30, 40] 
 

 
function bisectLeft (array, x) { 
 
    for (var i = 0; i < array.length; i++) { 
 
    if (array[i] >= x) return i 
 
    } 
 
    return array.length 
 
} 
 

 
console.log(bisectLeft(array, 5)) 
 
console.log(bisectLeft(array, 15)) 
 
console.log(bisectLeft(array, 25)) 
 
console.log(bisectLeft(array, 35)) 
 
console.log(bisectLeft(array, 45)) 
 

 
function bisectRight (array, x) { 
 
    for (var i = 0; i < array.length; i++) { 
 
    if (array[i] > x) return i 
 
    } 
 
    return array.length 
 
}

0

比以前接受的答案,對於相同尺寸的間隔工作的快速方法是:

var array = [5, 20, 35, 50] 
 

 
//Intervals: 
 
//  <5: 0 
 
// [5-20): 1 
 
// [20-35): 2 
 
// [35-50): 3 
 
// >=50: 4 
 

 
var getPosition = function(array, x) { 
 
    if (array.length == 0) return; 
 
    if (array.length == 1) return (x < array[0]) ? 0 : 1; 
 
    return Math.floor((x - array[0])/(array[1] - array[0])) + 1 
 
} 
 

 
console.log(getPosition(array, 2)); //0 
 
console.log(getPosition(array, 5)); //1 
 
console.log(getPosition(array, 15));//1 
 
console.log(getPosition(array, 20));//2 
 
console.log(getPosition(array, 48));//3 
 
console.log(getPosition(array, 50));//4 
 
console.log(getPosition(array, 53));//4 
 

 
console.log("WHEN SIZE: 1") 
 
array = [5]; 
 
//Intervals: 
 
// <5: 0 
 
// >=5: 1 
 
console.log(getPosition(array, 3)); 
 
console.log(getPosition(array, 5)); 
 
console.log(getPosition(array, 6));