【发布时间】:2016-03-26 06:57:00
【问题描述】:
给定
var arr = [1,2,true,4,{"abc":123},6,7,{"def":456},9,[10]]
我们可以使用Number构造函数过滤数组arr中的数字项
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`
cprototype 和 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")
?
在搜索类似问题并找到 JS Array.prototype.filter on prototype method 后提及 .call、.bind 和 .apply。虽然不确定如何实现过滤对象和具有上述特定属性的对象中描述的方法。
注意,问题也可以通过destructuring 或其他es-6、es-7 方法解决,与.filter() 相比,提供可比较甚至更严格的结果。也就是不使用.filter()
function(prop, value) {
}
模式。返回对象;即Object,{};和按属性过滤的对象;按属性值过滤的对象。
问题:
如何在不使用匿名函数
callbackpattern 的情况下过滤传递给Array.prototype.filter()的数组中带有或不带有Object原型或构造函数的对象?如何在不使用匿名函数
callback模式的情况下通过传递属性名称或值以匹配对象来过滤传递给Array.prototype.filter()的数组中的特定对象?
【问题讨论】:
-
为什么不想使用匿名函数?对我来说,这听起来像 我不想在 JavaScript 中使用 var
-
@guest271314 你能探索一下这个
arr.filter(Object.getNotifier);它的输出是一个错误,但它会检查你想要的。 -
我不确定您是否理解
Number和String作为filter函数的参数的作用?它们是 makeNumber 和 makeString,而不是 isNumber 和 isString - 传递为谓词。 -
@guest271314
[0,1, 2, "a"].filter(Number); // [1, 2]因为 0 是虚假值。 -
SO 不是博客或讨论组。请不要在阅读最新答案和 cmets 后将您的帖子变成对您的心态的持续评论。如果您对评论有回应。回复另一条评论。
标签: javascript arrays ecmascript-6 ecmascript-2016 ecmascript-next