尝试使用与这些值匹配的键值返回所有对象

时间:2016-05-24 23:31:09

标签: javascript lodash

所以我想说我有一些JSON:

{
    "users": [{
        "name": "bob",
        "age": 16,
        "likes": ["cats", "kayaking", "knitting"]
    }, {
        "name": "kyle",
        "age": 19,
        "likes": ["dogs", "soccer", "baseball"]
    }, {
        "name": "mike",
        "age": 18,
        "likes": ["cats", "cars", "kayaking"]
    }]
}

我想通过这个并返回包含“猫”和“皮划艇”之类的所有用户对象。我正在使用lodash,似乎没有lodash方法来做到这一点。我只看到_.findKey和_.includes。是否有一种方法或一组方法我可以使用这样做或者我最好只使用vanilla javascript?

2 个答案:

答案 0 :(得分:3)

您正在寻找_.filter()

var output = _.filter(input.users, function(item) {
    return _.includes(item.likes, 'cats')
        && _.includes(item.likes, 'kayaking');
});

使用您指定的过滤器功能过滤数组。如果此过滤器函数为数组的给定项返回true,则此项将包含在结果数组中。

答案 1 :(得分:1)

如果你想使用Vanilla JS:

您可以使用indexOf和比较器阵列进行比较。

使用此比较器数组,您可以过滤结果以仅返回符合条件的对象。

另外使用reduce方法返回true或false,具体取决于数组中字符串的一个是否与比较器数组匹配。

var comparator = ['dogs', 'baseball'];

var dogsAndBaseball = obj.users.filter(function(obj) {
  return obj.reduce(function(acc, cur) {
    return acc || comparator.indexOf(cur) > -1;
  }, false);
});

这将返回

[{
    "name": "kyle",
    "age": 19,
    "likes": ["dogs", "soccer", "baseball"]
}]