Lodash:过滤包含对象的数组并检查是否不为null

18

我刚开始使用lodash并有一个对象数组,其中一个属性可能是整数或null。我知道如何过滤掉数组中的null项,但如何检查它不是null呢?

假设我有这样一些数据:

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,也许有更好的方法来实现这个,谢谢您的帮助。

提前致谢。

5个回答

39

可以使用 _.reject_.filter 解决此问题:

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

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

演示


太好了。我正在寻找与Angular的$filter('filter')(collection, { 'default': '!someValue' })相对应的并行方法。 - Cody
如果您正在寻找没有默认键的记录,可以使用以下代码:var notHavingDefault = _.filter(sourceData, function(item) { return _.isUndefined(item.default) }); - Shrikant Prabhu

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

1

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>


1
尝试使用类似以下的内容:
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的元素。
或者,正如他们在精美手册中所说:迭代集合的元素,返回所有谓词返回truthy的元素数组。谓词使用三个参数调用:(value,index | key,collection)。

1
你可能需要注意,这里将nullundefined视为等效的。 - mu is too short

0

我认为这些库有时只是浪费时间。与其学习依赖于特定库的抽象,最好掌握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>");


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