[英]Convert these nested functions from arrow to old style and what happens with variables
我正在尝试从一个列表中查找不在第二个列表中的项目。 几乎是运气不好,我让它工作了,但只有箭头功能。 对我来说,普通函数更容易阅读,所以我尝试转换它,但结果不是我所期望的。
数据:
const arr1 = [
{
"key": 1,
"val": "one"
},
{
"key": 2,
"val": "two"
},
{
"key": 3,
"val": "three"
}
]
const arr2 = [
{
"key": 3,
"val": "three"
},
{
"key": 4,
"val": "four"
},
{
"key": 1,
"val": "one"
}
]
版本 1
arr1.filter((element) => arr2.findIndex((innerElement) => element.key === innerElement.key) === -1);
// produces object with key 2
版本 2
arr1.filter(function(element) {
return arr2.findIndex(function(innerElement) {
element.key === innerElement.key === -1
})
}) // produces all three objects in arr1
为了使正确的更简洁,我删除了额外的括号,它仍然有效:
arr1.filter(element => arr2.findIndex(innerElement => element.key === innerElement.key) === -1);
我在这里遗漏了一个关键方面。 我知道 arr1 中的每个项目都传递给 function,而内部 function 又将其结果传递给另一个 function,表达式可以访问两组 arguments 并被执行。 但我想我对订单或其他东西有错误的心理 model。
有人可以解释每个步骤中发生的事情以及如何思考吗? 我如何将它变成一个正常的 function?
我将处理很多嵌套结构,我觉得这是一个我想改进的薄弱环节。
谢谢
您需要返回比较的值。 === -1
测试必须是findIndex()
的结果,而不是在它的回调中。
arr1.filter(function(element) {
return arr2.findIndex(function(innerElement) {
return element.key === innerElement.key;
}) === -1;
});
这可以用some()
方法简化。
arr1.filter(function(element) {
return !arr2.some(function(innerElement) {
return element.key === innerElement.key
})
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.