LoDash는 동적 개체 배열을 검색 할 수 있지만 입력 된 개체 배열로는 검색 할 수 없습니다.

SM 아드 난

LoDash (2.2.1) _.find () 및 _.where ()는 다음과 같은 동적 객체 배열로 작동합니다.

[{
  id: 1,
  name: 'Some name',
  event: {id: 101, text: 'Event text'}
}]

그러나 유형이 지정된 객체 배열 (2 수준 깊이)은 아닙니다.

[new Person({
  id: 1,
  name: 'Some name',
  event: {id: 101, text: 'Event text'}
})]
// Event will be converted to Event type

JSFiddle을 참조하십시오 .

조언?

키릴

문제

문제는 유형이 지정된 배열 내부 event에 Person 객체 속성 유형 Event있지만 매개 변수 _.findobject입니다. 설명하겠습니다.

Lodash는 _.find두 번째 매개 변수로 전달하는 객체를 가져 와서 (대상이라고합시다)이 객체의 속성을 원래 객체와 비교하려고합니다 (즉, 첫 번째 매개 변수로 전달 된 것을 소스라고합시다). 따라서 형식화 된 배열의 경우 :

  • 소스 객체에는 유형 Person(괜찮음)이 있고 id (유형 int), 이름 (유형 문자열) 및 이벤트 (유형 Event)의 3 가지 속성이 있습니다.
  • 대상 객체에는 이름 (문자열 유형-괜찮습니다. 소스 객체 속성 이름 에도 문자열 유형이 있음)과 이벤트 (유형 객체-문제가 있습니다!)

baseIsEquallodash 내부의 메서드 내부를 살펴보십시오 . 다양한 검사가 있습니다. 그들 중 일부는 그다지 좋아 보이지 않지만 성능의 희생자입니다 (로 시작된 주석에서 더 많은 것을 참조하십시오 exit early for ...). 이 검사 중 하나에는 생성자를 가져 와서 비교하는 코드가 있습니다.

var ctorA = !support.argsObject && isArguments(a) ? Object : a.constructor,
    ctorB = !support.argsObject && isArguments(b) ? Object : b.constructor;

if (ctorA != ctorB && !(
    isFunction(ctorA) && ctorA instanceof ctorA &&
    isFunction(ctorB) && ctorB instanceof ctorB
    )) {
        return false;
}

그리고 // Object생성자가 다른 객체 인스턴스는 같지 않습니다 . 소스 객체의 이벤트 속성 Event생성자 클래스 생성자이지만 대상 객체의 이벤트 속성 생성자 function Object() { [native code] }는 리터럴 객체로 생성 된 것과 같습니다.

그래서 그것을 고치는 방법?

쉬운! _.find두 번째 매개 변수 predicate에 전달할 수 있습니다 . 따라서 코드는 다음과 같아야합니다.

var typedResult1   = _.find(typedArray, function(p) {
    return p.name === "Adnan" && p.event && p.event.id === 101;
});

jsFiddle

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관