为什么不能对函数的参数使用过滤器?

时间:2018-09-19 15:39:15

标签: javascript functional-programming arguments

我正在尝试检查传递给duckCount的参数是否具有属性'quack'并返回具有此属性的参数的数量。

为此,我试图在arguments数组上使用过滤器,但由于某些原因,我无法使用。有人知道为什么吗?

var notDuck = Object.create({ quack: true })
var duck = { quack: true }

duckCount(duck, notDuck) // 1

function duckCount() {
  // SOLUTION GOES HERE
  console.log(arguments)
  return arguments.filter((argument) => argument.hasOwnProperty('quack')).length
}

2 个答案:

答案 0 :(得分:1)

arguments是一个对象,但不是一个数组,其中filter是一个数组函数。使用rest parameter将参数对象转换为数组,然后应用数组函数

var notDuck = Object.create({
  quack: true
})
var duck = {
  quack: true
}
// 1

function duckCount() {
  // SOLUTION GOES HERE
  console.log(arguments)
  return [...arguments].filter((argument) => argument.hasOwnProperty('quack')).length
}

console.log(duckCount(duck, notDuck))

您还可以使用Array.from来从对象之类的数组中新建一个实例

var notDuck = Object.create({
  quack: true
})
var duck = {
  quack: true
}
// 1

function duckCount() {
  return Array.from(arguments).filter((argument) => argument.hasOwnProperty('quack')).length
}

console.log(duckCount(duck, notDuck))

答案 1 :(得分:0)

brk的解决方案是最好的方法,如果您可以保证您的代码仅能在支持ES6的浏览器上运行(如今,这些浏览器主要表示“非IE”),但是有时您确实必须支持旧版浏览器。 (由于使用了箭头功能,这可能不适用于OP,但是这可能对其他人有用。)如果需要,有一个有用的技巧,几乎不比使用数组解构或Array.from

return Array.prototype.filter.apply(arguments, function(argument) {/* your function goes here */});