2015-12-10 28 views
1

所以我有一個有趣的問題我不知道如何遵循,我需要使用lodash在一個對象中搜索兩個數組,看看如果x已經存在,讓我們看看安慰了放:查找是否已存在,JS和Lodash

enter image description here

有兩個鍵我感興趣的是:questChainssingleQuests,我想用lodash說寫兩個單獨的功能:找我的id X對象數組在questChainsquestChainID等於x。

第二個函數會說:我找對象的數組,其中singleQuestsquestTitle等於Ÿ

在尋求所以,如果我們舉一個例子,你可以看到questChainId1,所以如果我通過在一個1到功能我會得到true回來,我實際上不關心它的自我對象,否則我會得到錯誤。

同樣爲singleQuests,如果我通過在hello(不區分大小寫)我還是會回到true因爲用「你好」的questTitle的追求。我再次不在意物體回來。

我會寫這樣的方式是這樣的:

_.find(theArray, function(questObject){ 
    _.find(questObject.questChains, function(questChain){ 
     if (questChain.questChainId === 1) { 
      return true; 
     } 
    }); 
}); 

這僅僅是任務鏈ID比較。這似乎超級混亂,爲什麼?因爲我嵌套lodash找到,我也嵌套如果。它有點難以閱讀。

這是唯一的方法來做到這一點?或者,還有更好的方法?

+1

由於您選擇提供屏幕截圖而不是數據的可執行版本,因此您獲得的任何答案都可能未經測試。提供數據的「JSON.stringify」版本或手工製作的最小示例會更好。 – Amadan

+0

未經測試是好的,我只是尋找一個可能的方法的一般概念。 @Amadan – TheWebs

回答

2

是的,它可以更簡單地表達。

嘗試這樣:

var exampleArray = [{ 
 
    questChains: [{ 
 
    questChainId: 1, 
 
    name: 'foo' 
 
    }, { 
 
    questChainId: 2, 
 
    name: 'bar' 
 
    }], 
 
    singleQuests: [{ 
 
    questTitle: 'hello world' 
 
    }] 
 
}, { 
 
    questChains: [{ 
 
    questChainId: 77, 
 
    name: 'kappa' 
 
    }] 
 
}]; 
 

 
var result = _.chain(exampleArray) 
 
       .pluck('questChains') 
 
       .flatten() 
 
       .findWhere({ questChainId: 2 }) 
 
       .value(); 
 

 
console.log('result', result);
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js"></script>

使用chainvalue是可選的。他們只是讓你更簡潔地鏈接多個lodash方法。

pluck從數組中的每個對象中獲取屬性並返回這些屬性的新數組。

flatten需要一個嵌套的數組結構,並將其扁平化爲平面陣列結構。

findWhere將返回與提供的屬性名稱/值匹配的第一個元素。

將所有這些結果結合起來,從exampleArray中取出所有questChain數組,將它們展平成一個更容易迭代的單個數組,然後執行所需值的搜索。

不區分大小寫的匹配會更具挑戰性。您需要用接受匹配功能的方法(即find)或提前清理輸入來替換findWhere。無論哪種方式,您將需要撥打toLowertoUpper或您的名字上的一些變體來標準化您的搜索。