var arr = [1,2,true,4,{"abc":123},6,7,{"def":456},9,[10]]
我们可以使用Number构造函数过滤数组arr中的数字项
var res = arr.filter(Number); // [1,Array[1]]
在结果数组中是真的和[10]期望?如果我们在arr中用false替换false
var arr = [1,false,[10]] var res = arr.filter(Number) // [1,Array[1]]
使用Array.isArray
var res = arr.filter(Array.isArray) // [Array[1]]
串
var res = arr.filter(String) // [1,Object,Array[1]]
如果我们想要在arr中过滤作为对象的项目,请在索引4,7处尝试
var res = arr.filter(Object) // [1,Array[1]]
虽然我们更愿意简单地调用arr.filter(Object),但我们可以传递一个函数调用;尝试使用Object的不同属性,这样我们最终可以找到一个属性或方法,我们可以将它们用作函数或构造函数来传递给模式arr.filter(/ *方法,构造函数,其他方法* /)以返回过滤结果匹配对象,甚至是输入数组中对象的属性名称或值.
我们通过检查数组中的项是否具有名称等于“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原型和构造函数是未定义的.虽然我们确信这不会返回预期的结果
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”)
?
在搜索类似问题并找到JS Array.prototype.filter on prototype method之后提及.call,.bind和.apply.虽然不确定如何实现在过滤具有如上所述的特定属性的对象和对象中描述的方法.
注意,问题也可以通过解构或其他es-6,es-7方法解决,与.filter()相比,提供可比较的,甚至更严格的结果.也就是说,不使用.filter()
function(prop,value) { }
图案.归还对象;那是Object,{};和按属性过滤的对象;按属性值过滤的对象.
问题:
>如何在不使用匿名函数callbackpattern的情况下,在传递给Array.prototype.filter()的数组中使用或不使用Object原型或构造函数来过滤对象?
>如何通过将属性名称或值传递给匹配对象而不使用匿名函数回调模式来过滤传递给Array.prototype.filter()的数组中的特定对象?
解决方法
How to filter objects with or without Object prototype or constructor
within in an array passed to Array.prototype.filter() without using an
anonymous function callbackpattern ?
按照spec
callbackfn should be a function that accepts three arguments and
returns a value that is coercible to the Boolean value true or false
Number object(函数的构造函数)确实返回NaN以进行错误的数字转换,但String和Object构造函数不返回false值(是的,filter(Number)也过滤掉0)
var arr = [0,1,[10]]; arr.filter(Number); //outputs [1,Array[1]]
您可以创建客户功能OBJ,
function OBJ(value,index,arr){ return typeof value === "object" && !Array.isArray(value) }
或者在结果集中也欢迎使用Arrays,然后删除Array.isArray检查
function OBJ(value,arr){ return typeof value === "object" }
与…一起使用时
arr.filter(OBJ); //outputs [{"abc":123},{"def":456}]