javascript – 如何使用Array.prototype.filter过滤对象?

特定
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}]

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...