使用Lodash基于属性值过滤对象数组

76

我们有一个如下的对象数组

var myArr = [ {name: "john", age: 23},
              {name: "john", age: 43},
              {name: "jim", age: 101},
              {name: "bob", age: 67} ];

如何使用lodash获取myArr中name为john的对象列表?

8个回答

152

使用lodash的_.filter方法:

_.filter(collection, [predicate=_.identity])

遍历集合中的元素,返回谓词函数返回 truthy 值的所有元素所组成的数组。谓词函数接受三个参数:(value, index|key, collection)。

使用自定义函数作为谓词

 _.filter(myArr, function(o) { 
    return o.name == 'john'; 
 });

带有谓词作为过滤对象的一部分_.matches 迭代器速记法)

_.filter(myArr, {name: 'john'});

使用谓词 [key, value] 数组作为参数(即_.matchesProperty迭代器的简写形式)。

_.filter(myArr, ['name', 'John']);

文档参考:https://lodash.com/docs/4.17.4#filter


3
请注意,在使用 _.matchesProperty 迭代器简写的示例中,只有在 lodash v4 中才需要使用数组方括号。对于 lodash v3,则不需要数组方括号。 - NicBright

34

Lodash有一个“map”函数,它的工作方式就像jQuery的“map”函数一样:

var myArr =  [{ name: "john", age:23 },
              { name: "john", age:43 },
              { name: "jimi", age:10 },
              { name: "bobi", age:67 }];

var johns = _.map(myArr, function(o) {
    if (o.name == "john") return o;
});

// Remove undefines from the array
johns = _.without(johns, undefined)


1
谢谢你,但我特别询问了 lodash 的答案。我可以自己做一个循环。 - sarsnake
1
我删除了不相关的答案,并修复了你的脚本,因为它有错误。 - Technotronic
2
lodash的_.filter方法是最正确的答案,因为它可以在不删除未定义步骤的情况下完成OP所要求的操作。 - harymitchell
'Johns'或者'JOHNS',我该怎么办?结果仍然返回'johns'是可以的。 - Thắng Trương Khắc

16

使用 lodash:

const myArr = [ {name: "john", age: 23},
                {name: "john", age: 43},
                {name: "jim", age: 101},
                {name: "bob", age: 67} ];

const johnArr = _.filter(myArr, person => person.name === 'john');
console.log(johnArr)

输入图像描述

原生 JavaScript:

const myArr = [ {name: "john", age: 23},
                {name: "john", age: 43},
                {name: "jim", age: 101},
                {name: "bob", age: 67} ];

const johnArr = myArr.filter(person => person.name === 'john');
console.log(johnArr);

输入图像描述


8

通过名称、年龄进行过滤,同时您也可以使用map函数。

map和filter的区别

1. map - map()方法对每个数组元素调用一个函数,并返回一个带有对应结果的新数组。 map方法允许以用户喜好来操作数组中的项,在全新的数组中返回所选操作的结论。例如,考虑以下数组:

2. filter - filter()方法创建一个由所有通过提供的函数实现测试的数组元素填充的数组。 filter方法非常适合特定情况,其中用户必须识别数组中具有共同特征的某些项。例如,考虑以下数组:

const users = [
    { name: "john", age: 23 },
    { name: "john", age:43 },
    { name: "jim", age: 101 },
    { name: "bob", age: 67 }
];

const user = _.filter(users, {name: 'jim', age: 101});
console.log(user);

你忘了给第一条提供示例。 - Daniel J. Lewis

5
<div data-lang="js" data-hide="false" data-console="true" data-babel="false" class="snippet">
<div class="snippet-code">
<pre class="snippet-code-js lang-js prettyprint-override"><code>let myArr = [
    { name: "john", age: 23 },
    { name: "john", age: 43 },
    { name: "jim", age: 101 },
    { name: "bob", age: 67 },
];

let list = _.filter(myArr, item => item.name === "john");

这个对我有效,为什么人们会踩这个,这个解决方案有问题吗? - Arman Fatahi
@Arman 也许他们不喜欢这种获取结果的方式。我们可以用许多方法来做到这一点。但这个也不错。 - Nver Abgaryan
@NverAbgaryan - 和上面一样,如何动态应用密钥? - Shaik Habeeb

5

let myArr = [
    { name: "john", age: 23 },
    { name: "john", age: 43 },
    { name: "jim", age: 101 },
    { name: "bob", age: 67 },
];

// this will return old object (myArr) with items named 'john'
let list = _.filter(myArr, item => item.name === 'jhon');

//  this will return new object referenc (new Object) with items named 'john' 
let list = _.map(myArr, item => item.name === 'jhon').filter(item => item.name);


请注意,仅包含代码的答案不被视为完整。 - Ivan Kaloyanov
让我们假设'name'是动态键,您可以使用以下语法来实现:let dynamicKey = 'name'; let list = _.filter(myArr, item => item[dynamicKey] === 'jhon'); - Shaik Habeeb

1
lodash也有一个remove方法。
var myArr = [
    { name: "john", age: 23 },
    { name: "john", age: 43 },
    { name: "jim", age: 101 },
    { name: "bob", age: 67 }
];

var onlyJohn = myArr.remove( person => { return person.name == "john" })

0

可以像这样结合过滤器和包含来查看选项是否包含特定字符串(在此示例中为answerQuery)

  return filter(answerOptions, (option) => {
    return includes(option.label.toLowerCase(), answerQuery.toLowerCase());
  });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接