問題
的問題是,你的類型數組內的Person對象的性能event
類型是Event
但作爲參數來_.find
是object
。讓我解釋一下:
Lodash將一個對象傳遞給_.find
作爲第二個參數(讓我們把它稱爲target),並試圖比較這個對象的屬性和原始對象的屬性(作爲第一個參數傳遞,讓我們調用它來源)。因此,在類型數組的情況下:
- 源對象的類型是
Person
(沒關係),它有3個屬性:ID(int類型),名(字符串類型)和事件(類型Event
)
- 目標對象有2個屬性:名(字符串類型 - 這是確定,在源對象屬性名也有字符串類型)和事件(類型的對象 - 這裏的詞典定義。他的問題!)
看看裏面的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
謂詞。因此,代碼應該是:
var typedResult1 = _.find(typedArray, function(p) {
return p.name === "Adnan" && p.event && p.event.id === 101;
});
jsFiddle
@Cerbrus我不認爲這是一個確切的重複。這個問題是關於嵌套層次的,但事實並非如此。 – 2014-09-24 09:01:40
+在這個問題_.find工作正常,2級的深度。但在這裏造成問題。 +這裏的主要問題是動態對象vs類型對象 – 2014-09-24 09:04:34