2015-12-10 29 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或您的名字上的一些变体来标准化您的搜索。