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

gue*_*314 6 javascript arrays ecmascript-6 ecmascript-7 ecmascript-next

特定

var arr = [1,2,true,4,{"abc":123},6,7,{"def":456},9,[10]]
Run Code Online (Sandbox Code Playgroud)

我们可以arr使用Number构造函数过滤数组中的数字项

var res = arr.filter(Number); // [1, 2, true, 4, 6, 7, 9, Array[1]]
Run Code Online (Sandbox Code Playgroud)

是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]]
Run Code Online (Sandbox Code Playgroud)

运用 Array.isArray

var res = arr.filter(Array.isArray) // [Array[1]]
Run Code Online (Sandbox Code Playgroud)

String

var res = arr.filter(String) // [1, 2, true, 4, Object, 6, 7, Object, 9, Array[1]]
Run Code Online (Sandbox Code Playgroud)

如果我们想要在arr对象,索引中过滤项目4,7我们会尝试

var res = arr.filter(Object) // [1, 2, true, 4, Object, 6, 7, Object, 9, Array[1]]
Run Code Online (Sandbox Code Playgroud)

虽然我们宁愿简单地调用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]
Run Code Online (Sandbox Code Playgroud)

虽然当我们添加一个对象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`
Run Code Online (Sandbox Code Playgroud)

作为c prototype和constructor是undefined.虽然我们确信这不会返回预期的结果

var n = arr.filter(Object.hasOwnProperty, "abc"); // [1, 2]
Run Code Online (Sandbox Code Playgroud)

至少没有返回错误; 让我们继续吧

var n = arr.filter(function(prop, val) {
          return prop.hasOwnProperty(this.valueOf())
        }, "abc"); // [Object abc: 123__proto__: Object]
Run Code Online (Sandbox Code Playgroud)

返回预期结果; 虽然我们正在尝试使用

var n = arr.filter(/* function reference */, this /* optional parameters passed */)
Run Code Online (Sandbox Code Playgroud)

至

  1. 过滤数组Object:{}对象; 即使对象没有定义的原型或构造函数; 可选择将JSON字符串转换"{"abc":123}"为对象 虽然我们还没到达这个目的,但是;

  2. 将属性名称传递给.filter(callback, this)pattern this作为属性名称或对象的值; 或使用利用的方法 filter.bind,.call或.apply或其他方法来筛选来自输入数组的对象-不使用全

    .filter(function(prop, value) {})

    图案.我们怎样才能将Object.hasOwnProperty()调用强制转换为类似于的模式

    .filter(Object.hasOwnProperty, "abc")

?

提及.call,.bind并.apply在搜索类似的问题并在原型方法上找到JS Array.prototype.filter之后.虽然不确定如何实现在过滤具有如上所述的特定属性的对象和对象中描述的方法.

请注意,问题也可以通过来解决destructuring,或者其他es-6,es-7相比于当的方式,提供媲美或更严格的结果,.filter().也就是说,.filter()没有使用

   function(prop, value) {

   }
Run Code Online (Sandbox Code Playgroud)

图案.归还对象; 也就是说Object,{}; 和按属性过滤的对象; 按属性值过滤的对象.


问题:

  1. 如何Object在传递给Array.prototype.filter()不使用匿名函数callback模式的数组中使用或不使用原型或构造函数来过滤对象?

  2. 如何Array.prototype.filter()通过传递属性名称或值来匹配对象而不使用匿名函数callback模式来过滤传递给的数组中的特定对象?

gur*_*372 2

如何在传递给 Array.prototype.filter() 的数组中过滤带有或不带有对象原型或构造函数的对象,而不使用匿名函数回调模式?

根据规格

callbackfn 应该是一个接受三个参数并返回一个可强制转换为布尔值 true 或 false 的值的函数

Number 对象(函数的构造函数)确实会因错误的 Number 转换而返回 NaN,但 String 和 Object 构造函数不会返回 false 值(是的,filter(Number)也会过滤掉 0)

var arr = [0,1,2,true,4,{"abc":123},6,7,{"def":456},9,[10]];
arr.filter(Number); //outputs [1, 2, true, 4, 6, 7, 9, Array[1]]
Run Code Online (Sandbox Code Playgroud)

您可以创建一个客户函数OBJ,

function OBJ(value,index,arr){ return typeof value === "object" && !Array.isArray(value) }
Run Code Online (Sandbox Code Playgroud)

或结果集中也欢迎数组,然后删除Array.isArray检查

function OBJ(value,index,arr){ return typeof value === "object" }
Run Code Online (Sandbox Code Playgroud)

当与

arr.filter(OBJ); //outputs [{"abc":123},{"def":456}]
Run Code Online (Sandbox Code Playgroud)