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
있지만 매개 변수 _.find
는 object
입니다. 설명하겠습니다.
Lodash는 _.find
두 번째 매개 변수로 전달하는 객체를 가져 와서 (대상이라고합시다)이 객체의 속성을 원래 객체와 비교하려고합니다 (즉, 첫 번째 매개 변수로 전달 된 것을 소스라고합시다). 따라서 형식화 된 배열의 경우 :
Person
(괜찮음)이 있고 id (유형 int), 이름 (유형 문자열) 및 이벤트 (유형 Event
)의 3 가지 속성이 있습니다.baseIsEqual
lodash 내부의 메서드 내부를 살펴보십시오 . 다양한 검사가 있습니다. 그들 중 일부는 그다지 좋아 보이지 않지만 성능의 희생자입니다 (로 시작된 주석에서 더 많은 것을 참조하십시오 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;
});
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다