【问题标题】:Filtering array of objects with lodash based on property value根据属性值用 lodash 过滤对象数组
【发布时间】: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 的对象列表?

【问题讨论】:

    标签: javascript filter filtering 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 的示例。
        猜你喜欢
        • 2017-03-19
        • 1970-01-01
        • 2018-12-25
        • 2018-07-06
        • 2015-05-30
        • 1970-01-01
        • 2018-04-07
        • 1970-01-01
        • 2016-05-15
        相关资源
        最近更新 更多