2017-12-22 2 views
3

찾기 배열의 이벤트의 유닉스 타임 스탬프 곳입니다. 즉 이제 JS 우리가 이벤트 객체의 다음과 같은 배열을 가정 해 봅시다 :나는 "<em>이벤트</em>"의 배열을 처리하고있어 가까운 배열 인덱스

var MyEventsArray=[]; 
MyEventsArray[1513957775]={lat:40.671978333333, lng:14.778661666667, eventcode:46}; 
MyEventsArray[1513957845]={lat:40.674568332333, lng:14.568661645667, eventcode:23}; 
MyEventsArray[1513957932]={lat:41.674568332333, lng:13.568661645667, eventcode:133}; 
and so on for thousands rows... 

데이터 아약스 호출 함께 전송 JS으로 처리 할 JSON로 인코딩됩니다. 데이터 세트가 수신되면 다른 유닉스 타임 스탬프를 사용하여 다른 소스에서 오는 1513957845라고 말하면서 그 때 일어난 이벤트를 찾고 싶습니다 ... 아주 쉽습니다. 배열에서 요소를 가져와야합니다. 주어진 인덱스 (위 목록의 두 번째 인덱스). 이제 질문 : 주어진 색인을 찾을 수 없다는 것을 상상하십시오 (우리가 UXTimestamp = 1513957855를 찾고 있다고 상상해보십시오).이 색인은 배열에 존재하지 않지만 은 가장 가까운 색인을 갖고 싶습니다. MyEventsArray [1513957845] 요소를 가져 와서 1513957845는 1513957855와 가장 근접한 인덱스입니다. 이 결과를 얻으려면 어떻게해야합니까? 배열을 수신 할 때 배열 색인을 처리하는 데 어려움이 있습니다. 색인이 어디서 시작되는지 모르겠습니다.

기계가 그런 상황을 어떻게 처리할까요? 기계가 각 행 사이에 배치 된 더미/빈 요소에 대한 메모리를 할당 (및 낭비) 할 것인가 아니면 컴파일러가 자체 인덱스를 작성하고 공간을 최적화 할 수있는 능력이 있습니까? 즉 우리가하고있는 것처럼 인덱스 플레이하는 것이 안전하다거나 같이 배열을 할당하는 것이 좋습니다 :

이 경우
var MyEventsArray=[]; 
MyEventsArray['1513957775']={lat:40.671978333333, lng:14.778661666667, eventcode:46}; 
MyEventsArray['1513957845']={lat:40.674568332333, lng:14.568661645667, eventcode:23}; 
MyEventsArray['1513957932']={lat:41.674568332333, lng:13.568661645667, eventcode:133}; 
and so on for thousands rows... 

키와 인덱스가 명확하게이를 얻을 수 있어요 그래서 여기에 다른 우리가 키 값을 알지 못하더라도 MyArray [0]의 첫 번째 요소입니다. 이 접근법이 더 비쌉니다 (여기서 우리는 인덱스와 키를 메모리에 저장해야합니다) 아니면 컴파일러에서 효과가 동일합니까?

답변

3

. 심화, 배열 인덱스는 속성 이름이며 속성 이름은 문자열입니다.

이러한 희소 색인으로 인해 수백만 개의 빈 셀이 할당되는지 여부와 관련하여 문제가 발생하지 않습니다. 스파 스 배열은 빈 공간이 아닌 사용자가 입력 한 내용 만 저장합니다.

빠르게 키를 찾으려면, 당신이 그들을 정렬 키의 배열을 취득하고 당신이 원하는 것을 찾을 수 있습니다

var MyEventsArray=[]; 
 
MyEventsArray[1513957775]={lat:40.671978333333, lng:14.778661666667, eventcode:46}; 
 
MyEventsArray[1513957845]={lat:40.674568332333, lng:14.568661645667, eventcode:23}; 
 
MyEventsArray[1513957932]={lat:41.674568332333, lng:13.568661645667, eventcode:133}; 
 

 
var target = 1513957855; 
 

 
var closest= Object.keys(MyEventsArray) 
 
        .map(k => ({ k, delta: Math.abs(target - k) })) 
 
        .sort((a, b) => a.delta - b.delta)[0].k; 
 

 
console.log(closest);

+0

화려한 솔루션, 나는 Object.keys(). map을 과소 평가했습니다. 그것은 내가 찾고 있었던 바로 그 것이다. –

0

Object.keys(MyEventsArray)을 사용하면 이상하게 문자열로 표현 된 키 배열을 얻을 수 있습니다. 그런 다음 그것을 반복하고 가장 가까운 일치를 찾을 수 있습니다.

var MyEventsArray=[]; 
MyEventsArray[1513957775]={lat:40.671978333333, lng:14.778661666667, eventcode:46}; 
MyEventsArray[1513957845]={lat:40.674568332333, lng:14.568661645667, eventcode:23}; 
MyEventsArray[1513957932]={lat:41.674568332333, lng:13.568661645667, eventcode:133}; 
Object.keys(MyEventsArray) 
["1513957775", "1513957845", "1513957932"]

참조 : MyEventsArray[1513957775]MyEventsArray['1513957775'] 사이에는 차이가 없습니다 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

+0

니스 - 다음 수 '키 배열의 값 및 상기 검색된 값 사이의 차분 절대 이루어진 각 항목을 제 속성 및 추가 키 배열에 대해 .map' .. 다음 정렬 첫 번째 항목을 잡아 오름차순으로 반환 된 매핑 된 배열 .. 나는이'Object.keys (MyEventsArray)'를 좋아한다. – Forty3

0

당신은 스파 스 사용을 데이터를 저장하는 배열. 희소 배열은 여분의 메모리를 소비하지 않으므로 그 문제는 없습니다 (discussed here).

var MyEventsArray = []; 
 
MyEventsArray[1513957775] = { lat: 40.671978333333, lng: 14.778661666667, eventcode: 46 }; 
 
MyEventsArray[1513957845] = { lat: 40.674568332333, lng: 14.568661645667, eventcode: 23 }; 
 
MyEventsArray[1513957932] = { lat: 41.674568332333, lng: 13.568661645667, eventcode: 133 }; 
 

 
var tests = [1513957765, 1513957775, 1513957810, 1513957811, 1513957932, 1513957942]; 
 
tests.forEach(function(search) { 
 
    var closest = Object.keys(MyEventsArray).reduce(function(best, curr) { 
 
    return Math.abs(search - curr) < Math.abs(search - best) ? curr : best; 
 
    }); 
 
    console.log("search = %d, closest = %s, delta = %d", search, closest, search - closest); 
 
});

+0

_ "Object.keys가 숫자 키를 오름차순으로 정렬 할 것입니다"_라는 인용문이 있습니까? – JLRishe

+0

@ JLRishe for ES6, 예 : [Object.keys] (https://www.ecma-international.org/ecma-262/6.0/#sec-object.keys) -> [EnumerableOwnNames] (https : // www .ecma-international.org/ecma-262/6.0/# sec-enumerableownnames) (6 단계) -> [열거] (https://www.ecma-international.org/ecma-262/6.0/#sec-ordinary -object-internal-methods-and-internal-slots-enumerate) -> [OwnPropertyKeys] (https://www.ecma-international.org/ecma-262/6.0/#sec-ordinary-object-internal-methods- and-internal-slots-ownpropertykeys) -> _ 정수 인덱스 인 O의 각각의 속성 키 P에 대해 오름차순 숫자 인덱스 순서 _ –

+0

@JLRishe는 내 대답을 되 돌렸다. 'for ... in'은 동일한 이슈와 질서를 가지고 있고, for ... of는 너무 느리다. –

1

당신은 델타 경우 반복을 종료 할 allowes Array#some 걸릴 수 :

값 목록에서 정확한 또는 가까운 값을 찾으려면, 당신은 한 번 반복 할 Array.reduce 사용할 수 마지막 델타보다 커지고 있습니다.

var array = []; 
 
array[1513957775] = { lat: 40.671978333333, lng: 14.778661666667, eventcode: 46 }; 
 
array[1513957845] = { lat: 40.674568332333, lng: 14.568661645667, eventcode: 23 }; 
 
array[1513957932] = { lat: 41.674568332333, lng: 13.568661645667, eventcode: 133 }; 
 

 
var key = 0, 
 
    search = 1513957855; 
 

 
Object.keys(array).some(function (k) { 
 
    if (Math.abs(k - search) > Math.abs(key - search)) { 
 
     return true; 
 
    } 
 
    key = k; 
 
}); 
 

 
console.log(key);

+0

'Object.keys'는 특정 순서로 키를 반환 할 수 없으므로이 최적화는 구현 세부 정보를 사용합니다. – JLRishe

+0

@JLRishe, leaset ES2015의 최신 시스템에서는 정수 속성이 먼저 정렬되므로 정렬이 필요하지 않습니다. 반복을 위해 올바른 순서로 가져 오기만하면됩니다. 더 빠른 방법은 이진 검색을 사용하는 것입니다. –

+0

감사합니다. 나는 그들이 ES2015에서 표준화했다는 것을 깨닫지 못했습니다. – JLRishe

관련 문제