nums는 숫자로 이루어진 배열입니다.
가장 자주 등장한 숫자를 k 개수만큼 return해주세요.
라는 문제의 해결방법을 구글에 검색해보았다가 https://velog.io/@haileyself/Code-Kata-Javascript-W2-Day4- 라는 글을 보고 풀이법과 함께 hasOwnProperty()라는 메소드를 알게 되었다.
function topK(nums, k) {
let obj = {};
// 빈객체를 만든다
for ( i = 0 ; i < nums.length; i ++ ) {
if (!obj.hasOwnProperty(nums[i])) {
obj[nums[i]] = 1;
console.log('obj ; ',obj);
}
else {
obj[nums[i]] += 1;
}
}
// for 문을 돌려서 element 값을 확인한다,
// if 조건을 활용해서, 해당 객체가 property로
// nums[i]값을 가지고 있는지를 확인하고 없을 경우
// 객체의 프로퍼티를 설정하고, 1씩 증가할 수 있도록 한다.
var result = Object.keys(obj).map(function(key) {
return [Number(key), obj[key]];
});
console.log(result);
// map 함수를 활용해서 이중배열을 만든다.
// 객체의 각 요소를 map 함수를 활용해서, [ key, key값] 모양으로 이중배열을 생성
result.sort(function compareNums(a,b){
console.log('a:', a[1]);
console.log('b:', b[1]);
return b[1]- a[1];
});
console.log('resort:', result);
// 만든 이중배열을 result라는 변수에 담아, 두번째 key값(숫자가 나온 횟수) 을 기준으로 내림차순으로 정렬한다
let getNums = [];
for (i=0; i<k; i++){
getNums.push(result[i][0]);
console.log('getNums:', getNums);
}
return getNums;
}
// 정렬 후 for 문을 활용해서 k 개수의 직전까지 for문을 돌려서 빈 객체에 push해서 가장 많이 나온 값을 빈 배열에 넣는다 !
topK([1,1,1,2,2,3,4,4,4,4], 2);
hasOwnProperty() 메소드는 객체가 특정 프로퍼티를 가지고 있는지를 나타내는 불리언 값을 반환한다. 좀 더 쉽게 풀어서 말하자면, 객체에 특정 속성이 있는지 확인하는 메소드라고 할 수 있다. 그 속성이 있으면 true, 없으면 false를 반환한다. 단, 프로토타입 체인은 확인하지 않고, 해당 객체가 스스로 정의한 프로퍼티만을 판단한다. 이 hasOwnProperty 메소드는 특히 조건문과 함께할 때 그 실용성이 배가된다.
다음은 o 객체가 prop라는 명칭을 지닌 프로퍼티를 포함하는지를 판단하는 예제이다.
o = new Object();
o.prop = 'exists';
function changeO() {
o.newprop = o.prop;
delete o.prop;
}
o.hasOwnProperty('prop'); // returns true
changeO();
o.hasOwnProperty('prop'); // returns false
또 for in 문을 활용해 객체의 프로퍼티들을 순환할 수도 있다.
var buz = {
fog: 'stack'
};for (var name in buz) {
if (buz.hasOwnProperty(name)) {
console.log('this is fog (' + name + ') for sure. Value: ' + buz[name]);
}
else {
console.log(name); // toString or something else
}
}
출처: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty
https://mygumi.tistory.com/330