Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用javascript过滤函数_Javascript - Fatal编程技术网

如何使用javascript过滤函数

如何使用javascript过滤函数,javascript,Javascript,我正在chrome的控制台中运行下面的代码。我希望Filteredar包含3个对象,但是我得到的是空的{}作为第四个对象。其思想是通过flags数组进行过滤,并返回key==true(或===true-不确定哪一个有效)的对象,并且true key的值附加到filterDarr。感谢您的帮助 var flags = [ { usa: ["red", "white", "blue"] }, null, { germany: ["red", "yellow", "black"] }, {}, { j

我正在chrome的控制台中运行下面的代码。我希望Filteredar包含3个对象,但是我得到的是空的{}作为第四个对象。其思想是通过flags数组进行过滤,并返回key==true(或===true-不确定哪一个有效)的对象,并且true key的值附加到filterDarr。感谢您的帮助

var flags = [ { usa: ["red", "white", "blue"] }, null, { germany: ["red", "yellow", "black"] }, {}, { jamaica: ["green", "yellow", "black"] }, "", undefined];

var filteredArr = flags.filter(function(val) {

    return !(val === "" || typeof val == "undefined" || val === null || typeof val == "null");
});

过滤过滤器

空对象不为空。您需要通过以下方式检查对象是否为空:

Object.keys(obj).length === 0

首先,如果要过滤伪位,请在
Boolean
上进行过滤:

var filteredArr = flags.filter(Boolean)
这将产生与代码相同的结果,但更加优雅。现在,如果要筛选没有可枚举键的对象,可以使用Object.keys:

var filteredArr = flags.filter(Boolean).
                        filter(function(el){ return Object.keys(el).length })
或者:

var filteredArr = flags.map(Object).
                        filter(function(x){ return Object.keys(x).length })
或者,扁平化为单个过滤器:

var filtered =  flags.filter(function(x){ return Object.keys(Object(x)).length })

这段代码几乎让我头疼。
typeof val==“null”
可以删除,因为
typeof null==“object”
这就是你需要的
.filter(function(val){return!!val&&object.keys(val).length})
啊,比我快了一秒钟。我知道在这个例子中它很小,但每个过滤器都会在列表中循环,对吗?基本上是两次…@elclanrs对不起,我也经常这样。谢谢你的编辑:)@PSL是的。尽管就性能而言,建议使用
for
循环,而不是
过滤器,因为没有引擎会优化关闭,这在这里很昂贵。就迭代次数而言——在当前的实现中,它将迭代列表两次,但在未来的版本中,会有办法绕过它(转换到生成器中,然后链接到生成器,有效地迭代数组零次,并且在迭代之前不执行任何操作)。@BenjaminGruenbaum这将非常棒……)