Christoph의 아이디어를 통합하고 배열 및 객체 / 해시 ( each
및 친구)에 대한 몇 가지 비표준 반복 방법을 가정하면 총 약 20 줄의 선형 시간에서 차이, 결합 및 교차를 설정할 수 있습니다.
var setOPs = {
minusAB : function (a, b) {
var h = {};
b.each(function (v) { h[v] = true; });
return a.filter(function (v) { return !h.hasOwnProperty(v); });
},
unionAB : function (a, b) {
var h = {}, f = function (v) { h[v] = true; };
a.each(f);
b.each(f);
return myUtils.keys(h);
},
intersectAB : function (a, b) {
var h = {};
a.each(function (v) { h[v] = 1; });
b.each(function (v) { h[v] = (h[v] || 0) + 1; });
var fnSel = function (v, count) { return count > 1; };
var fnVal = function (v, c) { return v; };
return myUtils.select(h, fnSel, fnVal);
}
};
이것은 그 가정 each
및 filter
배열에 대해 정의하고 있으며, 우리는 두 개의 유틸리티 방법을 가지고 :
myUtils.keys(hash)
: 해시의 키가있는 배열을 반환합니다.
myUtils.select(hash, fnSelector,
fnEvaluator)
: true fnEvaluator
를 fnSelector
반환 하는 키 / 값 쌍을 호출 한 결과가있는 배열 을
반환합니다.
는 select()
느슨하게 커먼 리스프에서 영감을, 그리고 단지입니다 filter()
및 map()
하나에 굴렀다. (에서 정의하는 Object.prototype
것이 좋지만 그렇게하면 jQuery가 혼란스러워서 정적 유틸리티 메서드에 정착했습니다.)
성능 : 테스트
var a = [], b = [];
for (var i = 100000; i--; ) {
if (i % 2 !== 0) a.push(i);
if (i % 3 !== 0) b.push(i);
}
50,000 및 66,666 요소가있는 두 세트를 제공합니다. 이 값으로 AB는 약 75ms가 걸리고 결합과 교차는 각각 약 150ms가 걸립니다. (Mac Safari 4.0, 타이밍에 Javascript Date 사용)
20 줄의 코드에 대한 적절한 보상이라고 생각합니다.