根据属性值用 lodash 过滤对象数组

Posted

技术标签:

【中文标题】根据属性值用 lodash 过滤对象数组【英文标题】:Filtering array of objects with lodash based on property value 【发布时间】:2016-05-12 23:53:38 【问题描述】:

我们有一个这样的对象数组

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

如何从 myArr 中获取名称为 john 和 lodash 的对象列表?

【问题讨论】:

【参考方案1】:

Lodash 有一个类似于 jQuerys 的“地图”功能:

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)

【讨论】:

谢谢,但我特别问了 lodash 答案。我可以自己做一个循环。 我删除了不相关的答案并修复了您的脚本,因为它有错误 lodash _.filter 方法是最正确的答案,因为它完成了 OP 要求的没有删除未定义的步骤。 'Johns' 或 'JOHNS' 我该怎么办?结果仍然返回'johns'是好的【参考方案2】:

使用lodash_.filter方法:

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

遍历集合的元素,返回一个包含所有元素的数组,谓词返回真值。使用三个参数调用谓词: (值、索引|键、集合)。

将谓词作为自定义函数

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

将谓词作为过滤对象的一部分_.matches iteratee 简写)

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

将谓词作为 [key, value] 数组_.matchesProperty iteratee 的简写。)

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

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

【讨论】:

您应该提到您使用 _.matchesProperty iteratee 速记的示例仅适用于 lodash v4。对于 lodash v3,它没有数组括号。【参考方案3】:


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 也许他们不喜欢这种获得结果的方式。我们有很多方法可以做到这一点。不过这个也不错 @NverAbgaryan - 同上,如何动态申请密钥?【参考方案4】:

与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);

【讨论】:

【参考方案5】:

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" )

【讨论】:

【参考方案6】:

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);

【讨论】:

请记住,仅包含代码的答案不被视为完整 let list = _.filter(myArr, item => item.name === 'jhon');这里的name是静态放置的,而不是“item.name”,如果是动态key,怎么写?【参考方案7】:

**按姓名、年龄过滤** 也可以使用地图功能

地图和过滤器的区别

1. map - map() 方法使用为每个数组元素调用函数的结果创建一个新数组。 map 方法允许根据用户的喜好操作数组中的项目,在一个全新的数组中返回所选操作的结论。例如,考虑以下数组:

2。 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);

【讨论】:

您缺少#1 的示例。

以上是关于根据属性值用 lodash 过滤对象数组的主要内容,如果未能解决你的问题,请参考以下文章

过滤器会产生一个对象数组,就像使用 lodash 的 operator(%oil%) [重复]

根据值过滤对象属性

在 Angular 上使用 lodash 过滤对象数组

使用 Lodash 按属性合并对象数组

根据来自不同对象数组的属性和值过滤对象数组

如何根据属性过滤对象数组?