2014-04-28 3 views
0

Object 배열을 사용하고 특정 조건 집합과 일치하는 객체를 반환하는 함수를 만들어야합니다. 내가 지금까지 가지고하는 것은 매우 간단하다 : (의사) conditions가 일치하는 개체가 소유해야 하나 개 이상의 속성을 나타내는 개체입니다자바 스크립트 - 여러 속성을 기반으로하는 객체 반환

// input: conditions: { prop1: "x", prop2: "z"} 
//   source: [{ prop1: "x", prop2: "y"}, { prop1: "x", prop2: "z"}]; 
// output: array of objects with the same properties & values 
// ex: 
// getObjects({ prop1: "x", prop2: "z"}, [{ prop1: "x", prop2: "y"}, { prop1: "x", prop2: "z"}]); 
// returns: [{ prop1: "x", prop2: "z"}] 

//.... 
var results = []; 
for (var prop in obj) { 
    var match = false; 
    for (var cond in conditions) { 
     if (cond === prop && conditions[cond] == obj[prop]) { 
      match = true; 
     } 
    } 
    if (match) { 
     results.push(row); 
    } 
} 
return results; 

.

문제는 이것이 어떻게 든 중복 객체를 반환한다는 것입니다. 이는 분명히 발생할 수 없습니다. 나는 이것을 달성하기위한 표준 방법이 있음을 안다. (아마도 101 가지 프로그래밍일지도 모른다.)하지만 내 Google-foo는 실패하고있다.

참고 : 여기서는 문맥 때문에 Array.prototype.filter을 사용할 수 없습니다. 나는 한 세트 또는 여러 개의 테이블을 통해 실행 중이며 특정 기준과 일치하는 것을 반환하고자합니다.

는 기본적으로 아이디어가 입력 개체와 유사한 을있는 개체를 반환 "입니다 underscore

+0

당신이 결과 중복 객체가이 스크립트가 아닌 소스 테이블에서 행을 생성하는 쿼리에서 기인 하시겠습니까? – DevlshOne

+0

@DevlshOne : 관련된 쿼리가 없습니다. 해당 테이블은 마크 업에서 수동으로 생성 된 '

'입니다. 비록 내가 본질적으로하고있는 것은 질의이다. –

+0

기준 및 표 행 샘플에 대한 세부 정보를 제공해 주시겠습니까? – DevlshOne

답변

2

당신은 있었다
여러 속성이 일치하면 각 일치 항목에 '행'이 추가됩니다.
한 행당 한 번만 추가하십시오.이 루프는 조건부 루프 루프가 끝날 때마다 끝납니다.
그것은이다 중괄호 위치의 문제 :

var results = []; 
for (var i =0; i<source.length; i++) { 
    var row = source[i]; 
    var match = true; 
    var samePropCount = 0; 
    for (var prop in row) { 
     for (var cond in conditions) { 
      if (cond === prop) { 
       samePropCount++; 
       if (conditions[cond] != row[prop]) { 
        match = false; 
       } 
      } 
     } 
    } 
    if (!samePropCount) match=false; 
    if (match) { 
     results.push(row); 
    } 
} 
return results; 
+0

이 논리에는 결함이 있습니다. 당신의 객체가'{a : 1, b : 2, c : 3} '이고 조건은 {a : 1, c : 4}라고 가정합니다. '{a : 1}'에 매치가 발견되면 match는 true로 설정됩니다. 제공된 의사 코드의 'c'가 –

+0

과 일치하지 않으므로 항목이 결과에 잘못 추가됩니다. 모든 속성이 일치해야합니다. 조건이 {prop1 : "x", prop2 : "z"} 인 경우 객체 {{prop1 : "x", prop2 : "y"}'가 결과에 없습니다. –

+0

@BrianGlaz 당신이 맞습니다. 충분히주의 깊게 읽으십시오. 이제 좋을지도. – GameAlchemist

0

:.?

var evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; }); 
=> [2, 4, 6] 

당신이 기능을 구현하고자 할

+0

기본적으로 그렇습니다. 그러나 어떤 조건이 충족되어야 하는지를 나타내는 물체를 받아 들일 수 있어야합니다. –

+0

필터링 할 객체 배열을 전달할 수 있습니다 – juanpastas

관련 문제