2009-07-10 2 views
8

javascript의 연관 배열을 비교하는 품질 방법을 검색했습니다. 내가 찾은 유일한 해결책은 비교 배열 기능이있는 PHP.JS 프로젝트입니다. 유일한 문제는이 함수가 첫 번째 배열을 두 번째 배열의 키로 간주한다는 것입니다. 내 상황에서 적어도 두 배열 항상 동일한 키 또는 동일한 키를 있지 않습니다. 이로 인해 함수는 array1에 존재하지 않았지만 array2에 있었던 키를 포함하지 않는 결과를 출력합니다. 필자가 생각할 수있는 유일한 방법은 array_diff_associative() 함수를 뒤집은 인수로 두 번 실행 한 다음 결합하는 것입니다. 첫 번째 인수가 두 번째 키의 키로 다시 사용되므로 문제가되는 것 같습니다.두 개의 어레이 비교 Javascript - Associative

제안 사항? 감사합니다.

답변

7

나는 다음 당신이 원하는 일을해야한다고 생각 : 또한

function differences(a, b){ 
    var dif = {}; 
    for(key in a){ //In a and not in b 
    if(!b[key]){ 
     dif[key] = a[key]; 
    } 
    } 
    for(key in a){ //in a and b but different values 
    if(a[key] && b[key] && a[key]!=b[key]){ 
     //I don't know what you want in this case... 
    } 
    } 
    for(key in b){ //in b and not in a 
    if(!a[key]){ 
     dif[key] = b[key]; 
    } 
    } 
    return dif; 
} 

: 무력 접근 방식보다 그것을 할 수있는 더 좋은 방법이 있는지

function nrKeys(a) { 
    var i = 0; 
    for (key in a) { 
     i++; 
    } 
    return i; 
} 
function compareAssociativeArrays(a, b) { 
    if (a == b) { 
     return true; 
    } 
    if (nrKeys(a) != nrKeys(b)) { 
     return false; 
    } 
    for (key in a) {  
    if (a[key] != b[key]) { 
     return false; 
    } 
    } 
    return true; 
} 
+1

궁금한데, compareAssociativeArrays의 첫 번째 비교는 다음과 같아야합니다. if (a === b)? –

+0

err yes 아마 :-) –

+0

해결책에는 두 가지 단점이 있습니다. (1) a와 b가 같은 크기이고 a가 정의되지 않은 값을 가리키는 경우에는 true를 반환하고, b는 ' 그 열쇠는 없어. (2) a와 b의 값이 같지만 실제로는 객체이고 '=='연산자로는 같지 않은 두 개의 값이있는 경우 잘못 false를 반환합니다. 수정하는 것이 쉽지만 (1), 수정하는 데 더 많은 노력이 필요할 것입니다 (2). 대체 솔루션으로, ** toString() ** 또는 더 빨리 ** join ('') ** 메서드를 사용하여 두 문자열을 비교할 수 있습니다. – CuongHuyTo

2

난 정말 몰라 , 객체가 아니라 배열이며 일부 속성은 for..in (예 : Array.length)을 통해 열거 할 수 없으므로 응용 프로그램에서 고려해야합니다.

8

이것은 오래된 질문이지만 배열 비교를위한 Google 검색에서 처음 등장하기 때문에 배열에 동일한 값을 가진 두 개의 다른 개체가있는 경우에도 작동하는 대체 솔루션을 던질 것이라고 생각했습니다.

function arrays_equal(a, b) { 
    return JSON.stringify(a) == JSON.stringify(b); 
} 

참고 : 이것은 순서에 따라 다르기 때문에 순서가 중요하지 않은 경우 항상 미리 정렬 할 수 있습니다.