修改:这被错误地标记为欺骗(请参阅评论中的讨论)文章作者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);
答案 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在原始帖子的评论中提供(深埋,发布在这里以提高可见度):