2012년 3월 2일 금요일

javascript : union 구현

var set1 = [
    {
        "user":'jane',
        "phoneNo": '01011110010'
    },
    {
        "user":'kate',
        "phoneNo": '01010001101',
    }
];

var set2 = [
    {
        "user":'bob',
        "phoneNo": '01010101111'
    },
    {
        "user":'kate',
        "phoneNo": '01010001101',
    }
];

var union = function(set1, set2) {
    return set1.concat(set2).reduce(function(result,value) {
        result = [].concat(result);
        return (!result.some(function(match) {
            return JSON.stringify(match)===JSON.stringify(value);
        }) ? result.concat(value) : result);
    });
};
union(set1,set2);

reduce 에 대해 이해하고는 있지만 써먹어보고 싶어서 만들었다.
set1, set2 를 reduce 를 이용해 순서대로 add 하면서
some 으로 중복 내용을 검사하여 없으면 concat 으로 추가.
아니면 자기자신을 반환하는 구조.

최초 result 는 array 가 아닐 수 있으므로 result = [].concat(result) 로 강제로 array로 만드는 것은 salt.
객체간 비교를 stringify로 하는 것은 꼼수.
underscore 류의 union은 정말 deep copy처럼 객체를 다 뒤져서 비교하더라.