2014-09-24 40 views
2

LoDash(2.2.1)_.find()和_.where(這樣做)正在與動態對象數組像LoDash查詢動態對象-array但它不能與類型化對象陣列

[{ 
    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

建議?

+0

@Cerbrus我不認爲這是一個確切的重複。這個問題是關於嵌套層次的,但事實並非如此。 – 2014-09-24 09:01:40

+0

+在這個問題_.find工作正常,2級的深度。但在這裏造成問題。 +這裏的主要問題是動態對象vs類型對象 – 2014-09-24 09:04:34

回答

2

問題

的問題是,你的類型數組內的Person對象的性能event類型是Event但作爲參數來_.findobject。讓我解釋一下:

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

+0

您提出的解決方案是一種解決方法,但我們可以使用原生JavaScript來執行此操作,不需要LoDash。無論如何,我已經創建了我自己的功能來實現相同的:),最後非常感謝您在這個問題上的時間。 – 2014-10-02 06:01:16