2016-07-06 2 views
0

jquery를 사용하여 키 값 쌍에 상위 3 개 레코드 만 표시하려고합니다. 각 항목에 대한 색인을 어떻게 찾을 수 있습니까?jquery 사전 상위 3 개 레코드 표시

My trails fiddle

var _map = { 
    'severity-normal': 0, 
    'severity-minimal': 0, 
    'severity-moderate': 0, 
    'severity-severe': 0, 
    'severity-highly-severe': 0 
}; 

$.each(_map, function(key, value) { 
    //alert(index + ': ' + value); 

    $('body').append('Key: ' + key + ' Value: ' + value + '<br />') 

}); 
+0

은 "인덱스"무엇을 의미합니까 업데이트를 참조하십시오? 당신은 키와 값 모두를 잘 얻는 것처럼 보입니다. 또한 객체에는 배열과 같은 속성에 대한 순서가 없습니다. –

+0

나는 상위 3 개의 키 값 쌍만 표시하려고하고 있으며 모두 표시하지는 않습니다. 나는 (var I = 0; i Kurkula

+0

가장 큰 값을 가진 것처럼 상위 3 개? 그리고 색인이 아닌 상위 3 개 항목의 각 키를 찾으려고하지 않아야합니까? (그들은 결국 색인이 없습니다) –

답변

1

당신은 개체 속성의 배열을 반환 Object.keys를 사용해야이있다 할 수 있습니다 그 배열 값을 반복 : 여기

var _mapIndexes = Object.keys(_map); 

for (var i=0; i<_mapIndexes.length; i++) { 

    // i = the index of the _map key 
    // _mapIndexes[i] = the index in the _map object 
    // _map[_mapIndexes[i]] = the object 

    if (i > 2) break; 
    $('body').append('Key: '+_mapIndexes[i]+' Value: '+_map[_mapIndexes[i]]+'<br />') 
    top3.push(_map[_mapIndexes[i]]) 
} 

업데이트 된 링크에 대한 링크입니다 jsFiddle

값의 순서대로 개체를 정렬해야하는 경우. 당신은 .sort()Object.keys()를 사용할 수 있습니다

var _sortedMap = Object.keys(_map).sort(function(a,b){return _map[a]-_map[b]}) 

jsFiddle

1

좋아, 난 ... 당신이 무엇을 의미하는지 것 같아

O (NlogN) 솔루션, _MAP에서 N 항목이있는 경우

var _map = { 
    'severity-normal': 0, 
    'severity-minimal': 0, 
    'severity-moderate': 0, 
    'severity-severe': 0, 
    'severity-highly-severe': 0 
}; 

var list = []; 

$.each(_map, function(key, value) { 
    list.push({key:key, value:value}); 
}); 

list.sort(function(a,b) { return b.value - a.value; }); 

for(var i=0; i<3 && i<list.length; i++) { 
    alert(i + ': ' + list[i].value); 
} 

O (K * N) 용액, g 등 상부 K 항목 및 N 항목

var _map = { 
    'severity-normal': 0, 
    'severity-minimal': 0, 
    'severity-moderate': 0, 
    'severity-severe': 0, 
    'severity-highly-severe': 0 
}; 

function getTopElements(map, k) { 
    var lastMaximum = Infinity, currentMaximum; 
    var outputList = []; 

    while(outputList.length < k) { 
     currentMaximum = -Infinity; 

     for(key in map) { 
      if(map[key] > currentMaximum && map[key] < lastMaximum) { 
       currentMaximum = map[key]; 
      } 
     } 

     for(key in map) { 
      if(map[key] == currentMaximum) { 
       outputList.push(map[key]); 
      } 
      if(outputList.length >= k) break; 
     } 

     lastMaximum = currentMaximum; 
    } 

    return outputList; 
} 

var list = getTopElements(map,3); 

for(var i=0; i<list.length; i++) { 
    alert(i + ': ' + list[i].value); 
} 
+0

정렬은 무의미하며'.append()'는 유효한 함수가 아니며'.push()'가되어야합니다. 또한 이것이 어떻게 도움이됩니까? –

+0

@Spencer Wieczorek 예, append()를 입력하는 동안 간격을두고 있습니다. 수정 해줘서 고마워. 하지만 Chandana는 상위 3 개의 레코드를 원하기 때문에 먼저 내림차순으로 정렬해야합니다. 그러나 이제는 그것에 대해 생각하고 있습니다. 이것은 최적의 해결책이 아닙니다. 해결하도록하겠습니다. –

+0

모든 값은 '0'이므로 정렬을 통해 순서가 변경되지 않습니다. OP는 그들이 어떻게 분류 될 필요가 있는지에 대해서는 언급하지 않았다. –

관련 문제