在学习Lodash的drop时发现了一个很恶心的问题,一起某度一搜索,全是文档下copy下来的代码,但实际操作时我却遇到了如下的问题:
先放中文文档上的代码案例:
//true在第一位置
var users = [
{ 'user': 'barney', 'active': false },
{ 'user': 'fred', 'active': false },
{ 'user': 'pebbles', 'active': true }
];
_.dropWhile(users, function(o) { return !o.active; });
// => objects for ['pebbles']
官方这里将active值为 false的数据过滤掉,然而我切换了数据的格式后发现输出结果不对。
var _ = require('lodash');
var users = [
//请注意ture在最后一个位置
{
'user': 'barney',
'active': true
},
{
'user': 'fred',
'active': false
},
{
'user': 'pebbles',
'active': false
}
];
console.log(_.dropWhile(users, function (o) {
return o.active==false;
}))
//[ { user: 'fred', active: false },
//{ user: 'pebbles', active: false },
//{ user: 'barney', active: true } ]
这结果并不是我想要的,而是将整个数组全部返回了!
但是假如说我现在不想过滤false,我想过滤为true值,当我变换了数组后才发现了这个函数的问题所在:请看下例子
var _ = require('lodash');
var users = [
//请注意true在第一个位置
{
'user': 'fred',
'active': true
},
{
'user': 'barney',
'active': false
},
{
'user': 'pebbles',
'active': false
}
];
console.log(_.dropWhile(users, function (o) {
console.log(o.active)
return o.active==true;
}))
//[ { user: 'barney', active: false },
// { user: 'pebbles', active: false } ]
这次算是筛选成功了。。。。。。
这很玄学,不应该过滤掉数组中所有与迭代函数相同的数据吗????
打印代码输出后发现每次执行代码与迭代函数中的值不符时便会停止执行。。。。
D:\demo\first-vue\src\lodash>node test.js
false
[ { user: 'fred', active: false },
{ user: 'barney', active: true },
{ user: 'pebbles', active: false } ]
D:\demo\first-vue\src\lodash>node test.js
true
false
[ { user: 'barney', active: false },
{ user: 'pebbles', active: false } ]
D:\demo\first-vue\src\lodash>node test.js
true
[ { user: 'fred', active: true },
{ user: 'barney', active: false },
{ user: 'pebbles', active: false } ]
相对于的dropRightWhile函数也是这个特性,遇到第一个与迭代函数不符的判断时便会停止执行。