2012-01-27 2 views
2

두 부분으로 나뉜 질문입니다. 첫 번째 부분은 아래의 함수를 임의의 수의 배열을 허용하도록 변환하는 것입니다.getIntersect (arr1, arr2)로 변환 Javascript 함수는 여러 개의 인수와 JQuery로 변환합니다.

function getIntersect(arr1, arr2) { 
    var r = [], o = {}, l = arr2.length, i, v; 
    for (i = 0; i < l; i++) { 
     o[arr2[i]] = true; 
    } 
    l = arr1.length; 
    for (i = 0; i < l; i++) { 
     v = arr1[i]; 
     if (v in o) { 
      r.push(v); 
     } 
    } 
    return r; 
} 

이 기능 스 니펫은이 게시물의 Ian 및 Jeffrey에게 감사드립니다. 해시 테이블을 사용하는 성능은 밑줄 유틸리티 벨트 및 JQuery와 풍부한 배열 플러그인의 인덱스 방법보다 훨씬 더 있기 때문에 http://www.falsepositives.com/index.php/2009/12/01/javascript-function-to-get-the-intersect-of-2-arrays/

나는 관심이 있어요. 나는 Jquery가 jQuery.inArray() 메소드를 가지고 있다는 것을 알고 있지만, 문서는 인덱스를 사용하는 것처럼 들리지만, 1 만개 이상의 요소가있는 배열을 정렬하는 최적의 성능 솔루션을 찾고있다.

제 질문의 두 번째 부분은 Jquery friendly입니다. 아래의 JSON 객체를 가정하면서, Jquery를 사용하여 1) arrays1-5 만 선택하고 함수에로드 한 다음 하나의 배열을 반환합니다.

{ 
    "Container1": { 
     "Array1":  ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], 
     "Array2":  ["Sunday", "Thursday", "Friday", "Saturday"], 
     "Array3":  ["Sunday", "Friday", "Saturday"], 
     "Array4":  ["Sunday", "Friday", "Garbage"], 
     "Array5":  ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], 
     "ArrayOthers1":  ["1", "6", "8", "5"], 
     "ArrayOthers2":  ["1", "6", "8", "5"], 
     "ArrayOthers3":  ["1", "6", "8", "5"] 
    } 
} 

위의 대답은 [ "일요일", "금요일"] 배열 =입니다

답변

1

우리는 새로 만든 getIntersectN() 함수에 도우미로 getIntersect() 기능을 사용하여 시작할 수 있습니다

JQuery와에 관해서는
function getIntersect(arr1, arr2) { 
    var r = [], o = {}, l = arr2.length, i, v; 
    for (i = 0; i < l; i++) { 
     o[arr2[i]] = true; 
    } 
    l = arr1.length; 
    for (i = 0; i < l; i++) { 
     v = arr1[i]; 
     if (v in o) { 
      r.push(v); 
     } 
    } 
    return r; 
} 

function getIntersectN(){ 
    // call signature: getIntersectN(arr1, arr2, ..., arrN) 
    // NOTE: alternatively you can explicitly pass in an 'args' array to change the call signature to: 
    //  getIntersectN(args) [then just replace 'arguments' below with 'args'] 
    if(arguments.length == 0) return []; 
    else if(arguments.length == 1) return arguments[0]; 

    var intersect = arguments[0]; 
    for (var i = 1; i < arguments.length; i++){ 
     intersect = getIntersect(intersect, arguments[i]); 
    } 
    return intersect; 
} 

var data = { 
    "Array1":  ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], 
    "Array2":  ["Sunday", "Thursday", "Friday", "Saturday"], 
    "Array3":  ["Sunday", "Friday", "Saturday"], 
    "Array4":  ["Sunday", "Friday", "Garbage"], 
    "Array5":  ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], 
    "ArrayOthers1":  ["1", "6", "8", "5"], 
    "ArrayOthers2":  ["1", "6", "8", "5"], 
    "ArrayOthers3":  ["1", "6", "8", "5"] 
}; 

console.log(getIntersectN(data.Array1, data.Array2, data.Array3, data.Array4, data.Array5)); 

, 당신은 다음 AJAX 콜백,에서 JSON을로드하는 경우 :

$.ajax({ 
    ... 
    dataType: 'json', 
    success: function(response){ 
     var container = response.Container1; 
     var intersection = getIntersectN(container.Array1, ... container.Array5); 
    } 
}); 
+0

이것은 훌륭한 대답입니다! Jquery 파트에 대해 자세히 설명해 주시겠습니까? 문자열을 만들어 먹일 수 있습니까? 예 : "getIntersectN ("container "+"MyArrayName, container. "+"MySecondArrayName "); – Ariesto

+0

@Ariesto '문자열을 만들고 먹이면'무슨 뜻인지 모르겠다. – dgilland

+0

나는 하나의 문자열을 만드는 다른 정보를 반복하여이 배열 목록을 생성하는 상황에 처해있다 .Varray MyArrayChoices = "container.test [Array1], container.test [Array54] "그런 다음 문자열 변수와 eval()을 사용하여 다음과 같이 함수를 실행할 수 있습니다. getIntersectN (eval (MyArrayChoices)) 거의 작동하지만 eval은 마지막 array54에서만 작동하며 Array1에 대한 결과를 무시하거나 그것은 당신의 기능에 문자열로 모두 제출하기 때문에입니다. 내가 뭘하려고하는지 명확하게 정리합니까?이 주석은 형식을 지정하기가 매우 어렵습니다. ( – Ariesto