2013-04-01 2 views
1

나는 자바 스크립트 코드에서 몇 개의 배열을 가지고있다. (나는 knockout js도 사용하고있다.) 모든 배열의 공통 객체 만 포함하는 단일 배열을 얻고 싶다. .자바 스크립트의 배열 목록에서 공통 객체 만 가져 오기

내 코드는 다음과 같은 것입니다 :

Array1 = [{a: 1, b: 'something'}, {a: 2, b: 'something1'},{a: 3, b: 'something3'}]; 

Array2 = [{a: 3, b: 'something3'}, {a: 1, b: 'something'}, {a: 4, b: 'something4'}] 

Array2 = [{a: 3, b: 'something3'}, {a: 1, b: 'something'}, {a: 5, b: 'something5'}] 

그래서, 하나 개의 배열로 모두의 공통 원하는이 배열에서, 그래서 결과는 다음과 같습니다

Array4 = [{a: 1, b: 'something'}, {a: 3, b: 'something3'}] 

I

Array0 = [Array1, Array2, Array3]; 

내가 y를 희망 다음 배열 1, 배열 2 및 Array3이 같은 다른 배열 안에있는 것을 언급해야 나는 이걸 도와 줄 수있어, 고마워!

+0

"모두의 공통점"이라고 말하면서 배열의 2 개에있는 동안 결과에 something3을 포함시킵니다. 이것은 오타입니까? 배열 중 2 개에 있다면 뭔가 추가하고 싶습니까? – smerny

+0

오 .. 죄송합니다. 오류가 있습니다. 지금 바로 고치고 있습니다. 고맙습니다! –

+0

개체를 자세히 비교하는 데 관심이 있습니까? '{a : 1, b : "something"}'같은 참조 객체가 매번 *, 또는 동일한 속성을 가진 객체를 분리합니까? – apsillers

답변

2

:

Array1 = [{a: 1, b: 'something'}, {a: 2, b: 'something1'},{a: 3, b: 'something3'}]; 
Array2 = [{a: 3, b: 'something3'}, {a: 1, b: 'something'}, {a: 4, b: 'something4'}] 
Array3 = [{a: 3, b: 'something3'}, {a: 1, b: 'something'}, {a: 5, b: 'something5'}] 

all = [Array1, Array2, Array3] 

objects = {} 
counter = {} 

all.map(function(ary, n) { 
    ary.map(function(obj) { 
     var key = JSON.stringify(obj); 
     objects[key] = obj; 
     counter[key] = (counter[key] || 0) | (1 << n); 
    }) 
}) 

intersection = [] 
Object.keys(counter).map(function(key) { 
    if(counter[key] == (1 << all.length) - 1) 
     intersection.push(objects[key]); 
}) 

console.log(intersection) 

아이디어는 키로서 자신의 JSON 표현을 사용하여 해시 테이블에있는 모든 개체를 배치하는 것입니다.

+0

그건 정말 작동! 고맙습니다!! –

+0

너무 큰 데이터 모음에서 실행하지 않도록주의하십시오. – naugtur

+0

@naugtur : 이유가 무엇입니까? 성능은 내가 알 수있는 한 선형 적이다. – georg

0

javascript (Object comparison in JavaScript과 같은)에서 개체 비교를 수행하고 공통 요소를 찾기 위해 배열 교차 알고리즘 (예 : 포스터 중 하나와 같은)을 사용하는 사용자 지정 코드를 작성해야합니다. 예를 들어

관련 문제