给定
var arr = [1,2,true,4,{"abc":123},6,7,{"def":456},9,[10]]
arr
我们可以使用Number
构造函数过滤数组中的数字项
var res = arr.filter(Number); // [1, 2, true, 4, 6, 7, 9, Array[1]]
是true
和[10]
预期的结果数组?如果我们替换false
为true
arr
var arr = [1,2,false,4,{"abc":123},6,7,{"def":456},9,[10]]
var res = arr.filter(Number) // [1, 2, 4, 6, 7, 9, Array[1]]
使用Array.isArray
var res = arr.filter(Array.isArray) // [Array[1]]
String
var res = arr.filter(String) // [1, 2, true, 4, Object, 6, 7, Object, 9, Array[1]]
如果我们想过滤其中的项目arr
是对象,在索引处4
,7
我们尝试
var res = arr.filter(Object) // [1, 2, true, 4, Object, 6, 7, Object, 9, Array[1]]
虽然我们更喜欢简单地调用arr.filter(Object)
,但我们可以传递一个函数调用;尝试不同的属性,Object
以便我们最终找到可以用作函数或构造函数的属性或方法,以作为模式传递给以arr.filter(/* method, constructor, other approach */)
返回匹配对象的过滤结果,甚至是输入中对象的属性名称或值大批。
我们开始,天真地,通过检查数组中的项目是否constructor
具有name
等于"Object"
var res = arr.filter(function(prop) {
return prop.constructor.name === "Object"
}) // [Object, Object]
虽然当我们向arr
;添加一个对象时 例如;
var c = Object.create(null); arr.push(c);
var res = arr.filter(function(prop) {
return prop.constructor.name === "Object"
}) // `Uncaught TypeError: Cannot read property 'name' of undefined`
c
prototype
和constructor
现在一样undefined
。尽管我们确信这不会返回预期的结果
var n = arr.filter(Object.hasOwnProperty, "abc"); // [1, 2]
至少没有返回错误;让我们继续
var n = arr.filter(function(prop, val) {
return prop.hasOwnProperty(this.valueOf())
}, "abc"); // [Object abc: 123__proto__: Object]
返回预期的结果;虽然我们正在尝试使用
var n = arr.filter(/* function reference */, this /* optional parameters passed */)
至
过滤数组
Object
:{}
对象;即使对象没有定义的原型或构造函数;可选地将JSON
字符串转换"{"abc":123}"
为对象;虽然我们还没有走到这一步;将属性名称传递给用作属性名称或对象值的
.filter(callback, this)
模式;this
或利用一种方法使用filter.bind
,.call
或.apply
其他方法从输入数组中过滤对象-不使用完整的.filter(function(prop, value) {})
图案。我们如何将
Object.hasOwnProperty()
调用强制转换为类似于.filter(Object.hasOwnProperty, "abc")
?
提到.call
,在搜索了一个类似的Question并找到.bind
JS Array.prototype.filter onprototype方法之后。尽管不确定如何实现在过滤对象和具有上述特定属性的对象中描述的方法。.apply
请注意,问题也可以通过destructuring
或其他方法解决es-6
,es-7
与 相比,提供可比较甚至更严格的结果.filter()
。也就是说,.filter()
不使用
function(prop, value) {
}
图案。返回对象;即Object
, {}
; 和按属性过滤的对象;按属性值过滤的对象。
问题:
如何在不使用匿名函数模式的情况下过滤
Object
传递给的数组中带有或不带有原型或构造函数的对象?Array.prototype.filter()
callback
Array.prototype.filter()
如何在不使用匿名函数模式的情况下通过传递属性名称或值来过滤传递给的数组中的特定对象以匹配对象callback
?