jQuery 객체 평등


151

두 개의 jQuery 객체가 같은지 어떻게 알 수 있습니까? 특정 jQuery 객체에 대한 배열을 검색하고 싶습니다.

$.inArray(jqobj, my_array);//-1    
alert($("#deviceTypeRoot") == $("#deviceTypeRoot"));//False
alert($("#deviceTypeRoot") === $("#deviceTypeRoot"));//False

답변:


225

jQuery 1.6부터 사용할 수 있습니다 .is. 아래는 1 년 전의 답변입니다.

var a = $('#foo');
var b = a;


if (a.is(b)) {
    // the same object!
}

두 변수가 실제로 동일한 객체인지 확인하려면 다음과 같이하십시오.

var a = $('#foo');
var b = a;

... 그러면 고유 한 ID를 확인할 수 있습니다. 새 jQuery 객체를 만들 때마다 ID를 얻습니다.

if ($.data(a) == $.data(b)) {
    // the same object!
}

간단한 방법으로도 동일한 결과를 얻을 수 있지만 a === b위의 내용은 적어도 다음 개발자에게 테스트 대상을 정확하게 보여줄 수 있습니다.

어쨌든, 그것은 아마도 당신이 추구하는 것이 아닐 것입니다. 두 개의 서로 다른 jQuery 객체에 동일한 요소 집합이 포함되어 있는지 확인하려면 다음을 사용할 수 있습니다.

$.fn.equals = function(compareTo) {
  if (!compareTo || this.length != compareTo.length) {
    return false;
  }
  for (var i = 0; i < this.length; ++i) {
    if (this[i] !== compareTo[i]) {
      return false;
    }
  }
  return true;
};

출처

var a = $('p');
var b = $('p');
if (a.equals(b)) {
    // same set
}

이 솔루션 은 단일 요소 만있을 때 PHP 개발자 가 제공하는 솔루션을 단순화합니다 . jQuery 객체가 동일한 것으로 간주 될 수있는 또 다른 의미는 객체에 동일한 선택기와 컨텍스트가 있는지 여부입니다. 이것은 테스트하기에 충분히 쉽다 : A.selector === B.selector && A.context === B.context. 문맥이 항상 같은 경우가 많으므로 선택기 만 고려하면됩니다.
Casebash

2
@Casebash - 사실, 그러나 여러 선택기이 같은 결과 집합, 예를 끝낼 수 있다고 생각 : $(':first')$('*:first')
nickf

3
주의 @rampion 및 nickf, jQuery is ()는 선택기가 동일한 지 확인하지 않고 단순히 선택자가 겹치는 지 확인합니다. 증인 : jsfiddle.net/bnhkm/1
Bob Stein

당신의 equals기능은 순서에 민감한 것 같다. 비록 더 느리더라도 stackoverflow.com/a/29648479 와 같은 것이 더 많은 경우에 작동합니다.
Jayen

equals 함수는 오브젝트에 하나의 레벨이있는 ​​경우에만 작동합니다! a = b = [{dir : 'test', sort : [{test : {test : 1}}]}] 비교가 작동하지 않음
DavidDunham

16

여전히 모르는 경우 다음을 수행하여 원본 객체를 다시 가져올 수 있습니다.

alert($("#deviceTypeRoot")[0] == $("#deviceTypeRoot")[0]); //True
alert($("#deviceTypeRoot")[0] === $("#deviceTypeRoot")[0]);//True

$("#deviceTypeRoot")또한 선택자가 선택한 객체의 배열을 반환 하기 때문 입니다.


1
두 개의 경고가 표시됩니다 true당신이 DOM 요소의 참조를 비교하기 때문에, =====같은 결과를 줄 것이다 (어떤 종류의 강제 그들은 단지 두 개의 객체 참조하고, 필요 없음)
CMS

두 번째 진술은 실제로 True를 반환합니다
Casebash

아 맞습니다. 실수로 복사하여 붙여 넣기 = D
mauris

14

$.fn.equals(...)솔루션은 아마도 가장 깨끗하고 가장 우아한 하나입니다.

나는 다음과 같이 빠르고 더러운 것을 시도했다.

JSON.stringify(a) == JSON.stringify(b)

아마도 비싸지 만 편안한 것은 암묵적으로 재귀 적이지만 우아한 솔루션은 그렇지 않다는 것입니다.

그냥 내 2 센트.


1
두 jQuery 객체 간의 동등성을 확인하는 데는 좋지 않지만 표준 객체에는 적합하지 않습니다. "{a : 'x', b : 'y', c : 'z'} == {a : 'x', b : 'y', c : 'z'}"와 같이 나는 jQuery.isEqual (a, b)가 없는지 궁금하다.
iRaS

13
이것은 잘못이다. 객체 속성의 순서가 중요합니다. 그래서 당신이있는 경우 {a: 1, b: 2}{b: 2, a: 1}이 반환 false은 반환해야 할 때 true.
Eric Alberson

3
@EricAlberson,이 상황을 처리 할 수있는 다른 심층 비교 도구 또는 스크립트에 대한 제안이 있습니까?
Neil Monroe

8

일반적으로 말하자면 $ (foo)와 $ (foo)를 비교하는 것은 좋지 않습니다. 이는 기능적으로 다음 비교와 같습니다.

<html>
<head>
<script language='javascript'>
    function foo(bar) {
        return ({ "object": bar });
    }

    $ = foo;

    if ( $("a") == $("a") ) {
        alert ("JS engine screw-up");
    }
    else {
        alert ("Expected result");
    }

</script>

</head>
</html>

물론 "JS 엔진 스크류 업"을 기대하지는 않을 것입니다. jQuery가 무엇을하고 있는지 명확하게하기 위해 "$"를 사용합니다.

$ ( "# foo")를 호출 할 때마다 실제로 새 객체반환하는 jQuery ( "# foo")를 수행 합니다 . 따라서 그것들을 비교하고 동일한 객체를 기대하는 것은 정확하지 않습니다.

그러나 당신이 할 수있는 일은 다음과 같습니다.

<html>
<head>
<script language='javascript'>
    function foo(bar) {
        return ({ "object": bar });
    }

    $ = foo;

    if ( $("a").object == $("a").object ) {
        alert ("Yep! Now it works");
    }
    else {
        alert ("This should not happen");
    }

</script>

</head>
</html>

따라서 실제 프로그램에서 jQuery 객체의 ID 요소를 다음과 같이 비교해야합니다.

... 
$(someIdSelector).attr("id") == $(someOtherIdSelector).attr("id")

더 적절합니다.


1
분명히 jQuery에는 객체 속성이 없습니다. 엘프 킹은 이것을 의사 코드로 사용하는 것 같습니다
Casebash


4

이 기능을 사용하여 키를 기준으로 먼저 객체를 주문하십시오.

function sortObject(o) {
    return Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {});
}

그런 다음이 함수를 사용하여 문자열 화 된 버전의 개체를 비교하십시오.

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

여기에 예가 있습니다

객체 키가 다르게 정렬되고 값이 같다고 가정

var obj1 = {"hello":"hi","world":"earth"}
var obj2 = {"world":"earth","hello":"hi"}

isEqualObject(obj1,obj2);//returns true

-1

내용이 같은지 확인하려면 JSON.stringify (obj)를 사용하십시오.

예를 들어-var a = {key : val};

var b = {key : val};

JSON.stringify (a) == JSON.stringify (b) -----> 내용이 동일하면 사실입니다.


Kareem의 답변과 같은 키를 먼저 정렬해야합니다.
reggaeguitar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.