2011-01-02 5 views
3

자바 스크립트에서 값이 주어진 배열을 가지고 있다고 가정합니다.인덱스가 주어진 배열의 다음 요소와 이전 요소를 가져옵니다.

0  => 0x0000FF 
1200 => 0x00CCFF 
28800 => 0xFF0AFF 
36000 => 0xFFFFFF 

주어진 색인 값 사이의 요소를 어떻게 결정할 수 있습니까? 이전 예제에서 31073 값이 있으면 28800 => 0xFF0AFF36000 => 0xFFFFFF을 검색해야합니다.

+0

연관 배열이란? 'myarray [ '0'] = 0x0000FF;'? – stef

+0

개체로 쉽게 될 것입니다. 배열을 사용하면 훨씬 어려워집니다. –

+0

@Tomcat : 배열 인덱스에 예측 가능한 순서가 있습니까? – user113716

답변

1

; quixoto하고 자세한 설명과 답변을 패트릭 DW 모두

감사합니다. 그러나 나는 약간 다른 해결책을 가지고있다. 1 차원 배열을 사용하는 초기 접근법을 유지하려고했지만 아래에서 볼 수 있듯이 다른 차원을 추가하는 것이 훨씬 쉽고 효율적입니다. 여기서 사용 된 배열은 예측 가능성을 나타내지 만 프로젝트가 완성되면 그럴 수 없습니다.

var colors = [ 
    [0,  '121D4A'], 
    [10800, '000000'], 
    [21600, 'FF5900'], 
    [32400, 'D3EEF0'], 
    [43200, '7DCDFF'], 
    [54000, '7DA6FF'], 
    [64800, 'FF5900'], 
    [75600, '31428C'], 
    [86399, '121D4A'], 
]; 

function gradientStop(color1, color2, gradStop){ 
    var r = Math.floor(gradStop * parseInt(color2.substr(0, 2), 16) + (1 - gradStop) * parseInt(color1.substr(0, 2), 16)).toString(16); 
    var g = Math.floor(gradStop * parseInt(color2.substr(2, 2), 16) + (1 - gradStop) * parseInt(color1.substr(2, 2), 16)).toString(16); 
    var b = Math.floor(gradStop * parseInt(color2.substr(4, 2), 16) + (1 - gradStop) * parseInt(color1.substr(4, 2), 16)).toString(16); 
    return (r.length < 2 ? '0' + r : r) + (g.length < 2 ? '0' + g : g) + (b.length < 2 ? '0' + b : b); 
} 

function getColor(colors, currentIndex){ 
    for(var i = 0, m = colors.length; i < m; i++){ 
     if(currentIndex >= colors[i][0]){ 
      if(typeof(colors[i + 1]) !== 'undefined'){ 
       if(currentIndex <= colors[i + 1][0]){ 
        return gradientStop(colors[i][1], colors[i + 1][1], (currentIndex - colors[i][0])/(colors[i + 1][0] - colors[i][0])); 
       } 
      } 
     } 
    } 
} 

그리고 또한; 예 독 당점 그것은 나의 질문에 Programmatic gradient stops with Javascript, 따라서 gradientStop() 기능에 확장했다.

+0

+1 좋아 보인다. 원본과 @ quixoto의 솔루션 간의 하이브리드 정렬. – user113716

2

자바 스크립트의 희소 배열에서는이 작업을 수행하는 데 "기본 제공"방법이 없습니다. 어떤 효율성을 유지하면서 임의의 희소 색인에 대해 이것을 수행하는 가장 간단한 방법은 색인의 다른 lookaside 정렬 된 배열을 주 배열로 유지하는 것입니다. 그런 다음 lookaside 목록을 탐색하여 올바른 이웃 인덱스를 찾고 기본 배열로 돌아가 값을 가져올 수 있습니다.

배열이 거대하거나 액세스가 O (항목)보다 빠를 필요가있는 경우 lookaside 개체의 다양한 트리 구조를 조사 할 수 있습니다.

+0

** @ quixoto **; 배열 자체가 거대한되지 않습니다. 가능한 최대 색인 값은 86399이지만 0에서 86399 사이의 색인을 가진 약 10-20 개의 값만 있습니다. – Dan

+0

@TomcatExodus 간단히 대답을 만들면 효율성에 대해 걱정할 필요가 없습니다. http://stackoverflow.com/questions/4580105/programmatic-gradient-stops-with-javascript; 배열을 한 번 채우고 그 다음부터 인덱스를 작성하면됩니다. – Hemlock

+1

@TomcatExodus : 10-20 개의 값만있는 경우 반복적으로 수행하면 현명한 성능을 얻을 수 있습니다. 그 10-20 값으로 별도의 목록을 유지하십시오. 그 중 가장 가까운 것을 찾아 주 배열로 다시 색인으로 사용하십시오. –

2

몸체가없는 루프가 두 개인 while() 개를 사용하는 한 가지 방법이 있습니다.

항상 시작점이 중간에 있다고 가정합니다. 그렇지 않은 경우 몇 가지 빠른 추가 테스트가 필요합니다.

또한 출발점이 색상 위에 직접 있으면 어떻게 될지 잘 모르겠습니다. 따라서 그 점을 고려하지 않았습니다.

예 : 난 그냥 여기에 따라 원http://jsfiddle.net/tcVxP/4/

var num = 31234, 
    curr = num, 
    prev, 
    next; 

while(!colors[--curr] && curr); 
prev = colors[curr]; 

curr = num; 
while(!colors[++curr]); 
next = colors[curr]; 
+0

이 기술에 대한 참고 사항 : 가능한 모든 범위의 값을 선형 적으로 따라가는 값이므로 가능한 모든 범위의 값을 탐색하여 값이있는 인접한 인덱스를 찾습니다. 이것을 자주 호출해야하거나 초고속으로해야하는 경우 조심하십시오. 또한, 버그 : 테스트가'undefined'에 대한 엄격한 테스트가 아니기 때문에, 실제 이웃 인덱스의 값이 0이거나 다른 것이 허위 인 경우에는 찾을 수 없습니다. –

+1

@quixoto : 모든 색인을 걷는 것이 옳습니다. while 문에는 본문이 없으므로 빠릅니다. 별도의 목록을 유지하는 것에 대한 귀하의 의견은 좋은 아이디어입니다. 답변에 답을 추가해야합니다. 버그에 관해서는 사실입니다 만, 질문의 Array가 인덱스 '0'에서 유일한 거짓 값이라는 가정하에 작업하고 있다는 것을 제외하고는 사실입니다. 따라서 첫 번째'while'의'&& curr' 부분으로 덮여 있습니다. 불행히도 우리는 그 질문에 완전한 그림을 가지고 있지 않습니다. – user113716

+1

그건 * 내 답이다. 분명히 그것이 될 수있는 것처럼 분명하게 쓰여진 것은 아니다. :) FWIW, 모든 인덱스를 걷는 것은 루프 중에 얼마나 많은 작업을했는지에 관계없이 O (n)이지만 자세한 정보가 없으면 최적화 할 가치가있는 것을 아는 것이 어렵다는 데 동의합니다. –

관련 문제