2013-03-13 3 views
9

JSON 직렬화 객체에 대한 깊은 비교 및 ​​복사에 대한 몇 가지 구현을 시도 후, 나는 가장 빠른 종종 나타났습니다 단지입니다깊은 비교 및 ​​복제에 JSON.stringify를 사용하는 것이 좋습니까?

function deep_clone(a){ 
    return JSON.parse(JSON.stringify(a)); 
}; 
function is_equal(a,b){ 
    return JSON.stringify(a) === JSON.stringify(b); 
}; 

내가 바람을 피우고이 같은 느낌,하지만. 미래에 나를 괴롭히는 문제를 발견 할 것입니다. 그것들을 사용하는 것이 좋습니까?

+1

JSON 직렬화 가능 객체 만 사용합니다. – MaiaVictor

+1

FWIW 기사는 'JSON 개체'라고 말하면서 'JSON 개체'와 같은 것이 없다고 엄격히 말합니다. http://benalman.com/news/2010/03/theres-no-suchthing-as-a- json/ – DanC

+0

@BenjaminGruenbaum은 정확히 중복되지 않지만, 그 사람들은 어쨌든 구 JSON 라이브러리를 사용하고 있습니다. – MaiaVictor

답변

9

JavaScript는 키의 순서를 보장하지 않습니다.

같은 순서로 입력하면이 방법이 대부분 작동하지만 신뢰할 수는 없습니다.

또한, 그 키는 상이한 순서로 입력 된 깊이와 동일했으나 개체 거짓 반환 :

JSON.stringify ({A : 1, B 2}) === "{ "a": 1, "b": 2} "

==="{ "b": 2, "a": 1} "

+1

참. 그것은 다른 대답을 잘못 만든다. 진드기를 검토했습니다. – MaiaVictor

2

키 - 값 쌍이 항상 같은 순서로되어있는 한, stringify를 사용하여 deep equals 연산자 (===)를 사용하여 비교할 수 있습니다.

4

나는 그것이 이전의 질문이라는 것을 알았지 만 누군가가이 페이지에서 멀어져서 비교/복제를 위해 JSON.stringify을 사용하는 것이 문제가되지 않는 한 실수로 작동한다고 생각하기 때문에 대답에 조금 더 추가하고 싶었습니다. 객체를 비교/복제하는 데 사용됩니다. 구성원은 순서가 없습니다. (허용 된 답변에 공평하기 위해서 은 생각하지 말아야하며, "[회원들이] 같은 순서로 입력되면,이 접근법은 대부분 일 때 일 것입니다.")

코드는 아마도 가장 가능성이 딸꾹질을 보여

JSON.stringify(NaN) === JSON.stringify(null) 
// => true 

JSON.stringify(Infinity) === JSON.stringify(null) 
// => true 

// or, to put it all together: 
JSON.stringify({ val1: (1/0), val2: parseInt("hi there"), val3: NaN }) === JSON.stringify({ val1: NaN, val2: null, val3: null }) 
// => true 

// and here's the same example with "cloning" rather than comparison: 
JSON.parse(JSON.stringify({ val1: (1/0), val2: parseInt("hi there"), val3: NaN })) 
// => Object {val1: null, val2: null, val3: null} 

이러한 순서는 (다른 사람이 말했듯이,이 일 수있는) 문제가없는 경우에도 문제를 일으킬 수있는 단점이 있습니다. 대부분의 경우에 이러한 단점은 추악한 머리를 뒤 틀릴 것 같지 않지만 버그를 발견하기가 힘들 기 때문에 그 사실을 알고있는 것이 좋습니다.

+0

추가 주셔서 감사합니다! – MaiaVictor