【问题标题】:Lodash: Filter array of objects and check if not nullLodash:过滤对象数组并检查是否不为空
【发布时间】:2016-08-19 06:40:25
【问题描述】:

我刚开始使用 lodash 并拥有这个对象数组,其中一个属性要么为整数,要么为空。我知道如何过滤数组中为空的项目,但是如何检查它是否不为空?

假设我有这样的事情:

var users = [
    { 'user': 'barney', 'default': 1 },
    { 'user': 'dino', 'default': 0 },
    { 'user': 'wilma', 'default': 1 },
    { 'user': 'fred',   'default': null }
];

然后我想要类似的东西:

var notNullDefault = _.filter(sourceData, ['is_default', ! null ]); // objects with names barney, dino, wilma
var nullDefault = _.filter(sourceData, ['is_default', null ]); // object with name fred

再说一次,我是 lodash 的新手,所以也许还有更好的方法来实现这一点。

提前致谢。

【问题讨论】:

    标签: javascript arrays underscore.js lodash


    【解决方案1】:

    这可以通过_.reject_.filter 解决:

    var notNullDefault = _.reject(sourceData, ['default', null]);
    
    var nullDefault = _.filter(sourceData, ['default', null]);
    

    DEMO

    【讨论】:

    • 完美。正在寻找 Angular 的 $filter('filter')(collection, { 'default': '!someValue' }) 的相似之处。
    • 如果您正在寻找没有默认密钥的记录,您可以使用var notHavingDefault = _.filter(sourceData, function(item) { return _.isUndefined(item.default) });
    【解决方案2】:

    您可以创建几个谓词函数来检查默认用户而不是默认用户:

    var isDefaultUser = function(user){
        return _.isNull(user.default);
    }
    
    var isNotdefaultUser = _.negate(isDefaultUser);
    

    然后它们可以用于过滤等。

    var defaultUser = _.filter(users, isDefaultUser);
    
    var notDefaultUsers = _.filter(users, isNotdefaultUser);
    
    // partition will be an array; first element contains the default users
    // second element contains the non default users 
    var parition = _.partition(users, isDefaultUser);
    

    【讨论】:

      【解决方案3】:

      试试这样的:

      var notNullDefault = _.filter(users, function(elem) { return elem.default !== null; }); 
      var nullDefault = _.filter(users, function(elem) { return o.default === null; }); // object with  name fred
      

      返回的数组只包含回调函数返回true的元素。

      或者,正如他们在the fine manual 中所说的那样:迭代集合的元素,返回一个包含所有元素的数组,谓词返回真值。谓词使用三个参数调用:(值、索引|键、集合)。

      【讨论】:

      • 您可能需要注意,您在这里将nullundefined 视为等效项。
      【解决方案4】:

      let items = [1, 2, 4, null];
      
      let isHaveNull = _.some(items, (item) => _.isNull(item));
      
      console.log(isHaveNull);
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

      【讨论】:

        【解决方案5】:

        我相信这些库有时只是在浪费时间。与其学习依赖于库的特定抽象,不如更好地掌握 ES6 数组函数和箭头。所以给你;

        var users = [
                     { 'user': 'barney', 'default': 1 },
                     { 'user': 'dino',   'default': 0 },
                     { 'user': 'wilma',  'default': 1 },
                     { 'user': 'fred',   'default': null }
                    ],
         userNull = [],
         userFull = [];
        users.forEach(e => e.default == void 0 ? userNull.push(e) : userFull.push(e));
        
        document.write("<pre> userNull:\n" + JSON.stringify(userNull, null, 2) + "</pre>");
        document.write("<pre> userFull:\n" + JSON.stringify(userFull, null, 2) + "</pre>");

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-10
          相关资源
          最近更新 更多