본문 바로가기

Slack 채널 정리

js - 배열에서 모든 중복된 값의 index 를 리턴해주는 함수

배열에서 모든 중복된 값의 index 를 object literal 형식("중복값 : 인덱스 array")으로 리턴해주는 기능을 구현해봤습니다.  가령, var fruites = ["Apple","Banana","Kiwy","Banana","Mango","Kiwy","Banana"]; getDupInArray(fruites); 이런 식으로 하면 { Banana : [1, 3, 6], Kiwy: [2, 5] } 와 같이 구해주죠. 구현 중 reduce 나 object 필터링하는 부분 등을 봐두시면 도움이 될 듯 싶네요.

function uniqArrayValues(inArr) {
	return inArr.reduce(function(prev, curr){
		if (prev.indexOf(curr) < 0) prev.push(curr);
		return prev;
	},[]);
}

function filter(obj, func){
    var ret = {};
    for(var p in obj) {
        if(obj.hasOwnProperty(p) && func(obj[p])) {
            ret[p] = obj[p];
		}
	}
    return ret;
}

function getDupInArray(inArr) {
	var uniq = uniqArrayValues(inArr);

	var myObj = {};
	for (var i = 0, l = uniq.length; i < l; i++) {
		myObj[uniq[i]] = []; 
	}

	inArr.forEach(function(x, i) { myObj[x].push(i); });
	var newObj = filter(myObj, function(val) {
		return val.length > 1;
	});

	return (Object.keys(newObj).length === 0)?-1:newObj;
}