带箭头函数回调的Array.prototype.filter()参数? (没有这个约束)

时间:2017-08-31 21:35:48

标签: javascript arrays ecmascript-6 arrow-functions

修改:这被错误地标记为欺骗(请参阅评论中的讨论)文章作者here

提供了此特定问题的解决方案

https://hackernoon.com/rethinking-javascript-death-of-the-for-loop-c431564c84a8的启发,我一直在重构一些旧代码。

使用Array.prototype.filter传递参数遇到问题,因为Array.prototype.filter的第二个参数(callback,thisArg)绑定了回调中的“this”对象,但是箭头函数没有绑定“this”

在我的例子中,我通过使用“Object.keys()”从关联数组中获取键(是的,我知道,技术上在js中不可用),然后通过关联中对象的属性过滤该数组数组“this [item] .property”,但由于此绑定不可用,因此失败。

那么,拥抱箭头函数,如何将参数传递给filter()中的回调?

const arr = {
    a: {
      property: true,
      otherProp: false
    },
    b: {
      property: true,
      otherProp: false
    },
  },
  hasProperty = item => this[item].property,
  getMatchingKeys = object => Object.keys(object).filter(hasProperty, object);
getMatchingKeys(arr);

2 个答案:

答案 0 :(得分:1)

您可以使用Object.entries。它提供了键和值,因此您不需要对对象本身的引用:



const arr = {
        a: {
            property: true,
            otherProp: false
        },
        b: {
            property: true,
            otherProp: false
        },
        c: {
            property: false, // to be excluded
            otherProp: true
        },
    },
    hasProperty = ([key, value]) => value.property,
    first = ([key]) => key,
    getMatchingKeys = object => Object.entries(object).filter(hasProperty).map(first);

console.log(getMatchingKeys(arr));

.as-console-wrapper { max-height: 100% !important; top: 0; }




您也可以使用bind - 不要绑定this,而是使用第一个参数:



const arr = {
        a: {
            property: true,
            otherProp: false
        },
        b: {
            property: true,
            otherProp: false
        },
        c: {
            property: false, // to be excluded
            otherProp: true
        },
    },
    hasProperty = (object, key) => object[key].property,
    getMatchingKeys = object => Object.keys(object).filter(hasProperty.bind(null, arr));

console.log(getMatchingKeys(arr));

.as-console-wrapper { max-height: 100% !important; top: 0; }




另请参阅my answer to another question中的其他一些选项。

答案 1 :(得分:0)

该文章的作者提供了answer in the comments,此处提供以供参考:

const arr = {
  a: {
    property: true,
    otherProp: false,
  },
  b: {
    property: true,
    otherProp: false,
  },
}
const hasProperty = object => item => object[item].property
const getMatchingKeys = object => Object.keys(object).filter(hasProperty(arr))
getMatchingKeys(arr) // = ['a', 'b']

进一步阅读,由@bergi在原始帖子的评论中提供(深埋,发布在这里以提高可见度):

  1. jQuery pass more parameters into callback
  2. How do I pass an extra parameter to the callback function in Javascript .filter() method?