查找是否已存在,JS和Lodash

时间:2015-12-10 07:13:56

标签: javascript lodash

所以我有一个有趣的问题我不知道如何遵循,我需要使用lodash来搜索对象中的两个数组,看看x是否已经存在,让我们看看控制台输出:

enter image description here

我感兴趣的有两个键:questChainssingleQuests,我想用lodash编写两个单独的函数来说:在{{1}的对象数组中找到我的id x } questChains等于x。

第二个函数会说:在questChainID singleQuests等于y

的对象数组中找到一个任务

因此,如果我们举一个示例,您可以看到questTitlequestChainId,所以如果我将1传递给所述函数,我会得到1,我不会实际上关心自己的对象,否则我会变得虚假。

同样适用于true,如果我传入singleQuests(不区分大小写),我会回来hello,因为有true的'{1}} ”。我再一次不关心回来的物体。

我写这个的方式是这样的:

questTitle

这仅适用于任务链ID比较。这似乎超级凌乱,为什么?因为我正在筑巢lodash找到,我也在筑巢。它有点难以阅读。

这是唯一的方法吗?还是有更好的方法?

1 个答案:

答案 0 :(得分: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将返回与提供的属性名称/值匹配的第一个元素。

结合所有这些结果,我们从questChain获取所有exampleArray数组,将它们展平为单个数组,可以更容易地迭代,然后搜索所需的值。< / p>

不区分大小写的匹配将更具挑战性。您需要使用接受匹配函数(即findWhere)的方法替换find或提前清理您的输入。无论哪种方式,您都需要拨打toLowertoUpper或姓名上的某些变体来标准化您的搜索。