理解双返回语句需要Javascript
我是JS新手,基本上每天都在学习新东西,我只是在学习一些东西,比如,如何动态更新数组等等。无论如何,我通常会尝试从网络中挑选干净的JS代码片段并进行调试,直到我明白它的真正含义。下面是我今天发现的一个片段:理解双返回语句需要Javascript,javascript,Javascript,我是JS新手,基本上每天都在学习新东西,我只是在学习一些东西,比如,如何动态更新数组等等。无论如何,我通常会尝试从网络中挑选干净的JS代码片段并进行调试,直到我明白它的真正含义。下面是我今天发现的一个片段: var array1 = [ { tagId: 1, tagName: 'tag 1' }, { tagId: 2, tagName: 'tag 2' }, { ta
var array1 = [
{ tagId: 1, tagName: 'tag 1' },
{ tagId: 2, tagName: 'tag 2' },
{ tagId: 3, tagName: 'tag 3' },
{ tagId: 4, tagName: 'tag 4' }
];
var array2 = [
{ tagId: 1, tagName: 'tag 1' },
{ tagId: 2, tagName: 'tag 2' },
{ tagId: 8, tagName: 'tag 8' }
];
var array3 = [
{ tagId: 1, tagName: 'tag 1' },
{ tagId: 0, tagName: 'tag 0' },
{ tagId: 9, tagName: 'tag 3' },
{ tagId: 12, tagName: 'tag 12' },
{ tagId: 13, tagName: 'tag 3' },
{ tagId: 14, tagName: 'tag 2' },
{ tagId: 6, tagName: 'tag 6' },
];
var a4 = common(array1, array2, array3)
console.log(a4);
function common( /*…*/ ) {
var a = arguments;
res = a[0]
for (var i = 1; i < a.length; i++) {
res = res.filter(function (el) {
return a[i].filter(function (el2) {
return el2.tagId === el.tagId
}).length
})
}
return res
}
我真的不理解双返回语句。我的理解是,返回el2.tagId===el.tagId
返回true或false并返回:
a[i].filter(function (el2) {
return el2.tagId === el.tagId
}).length
它返回长度,我认为应该是一个整数,但是返回执行的顺序是什么?谁是return el2.tagId===el.tagId
返回的对象
当我看到双返回语句时,我总是感到困惑。谁能给我解释一下吗
Jsfiddle
编辑::试着在你的答案中详细一点
多谢各位
Alex-Z.这些“双”返回嵌套在匿名函数中;他们不是从同一个环境中回来的
由内而外的工作:
return el2.tagId === el.tagId
正在从a[i]
的filter()方法中的匿名函数返回布尔值:
a[i].filter(function (el2) {
return el2.tagId === el.tagId
})
在res
的filter()
方法中的匿名函数中返回该表达式结果的长度:
res = res.filter(function (el) {
return a[i].filter(function (el2) {
return el2.tagId === el.tagId
}).length
})
注意:结果的length
属性被filter()
强制为布尔值
filter()
是数组原型的一种方法,它构造一个新数组,由提供的匿名函数返回true的项组成(参见MDN:)Javascript遵循函数范式。将函数视为不同的代码体。例如,下面两个是等效的
var sum = 0;
[1,2,3].filter(function(el) {
return el > 2 ? true : false;
});
与
var moreThan2 = function(el) {
return el > 2 ? true : false;
}
[1,2,3].filter(moreThan2);
Javascript使用函数创建整合的逻辑块。在许多代码中,javascript开发人员使用匿名函数,这些函数不会被分配给变量
编辑
函数公共(/*…*/){
var a=参数,
FilterListForTagSwithmore超过一个匹配元素=函数(el){
函数findTagsWithSameTag(el2){
返回el2.tagId==el.tagId;
}
返回一个[0]。过滤器(findTagsWithSameTag).length;
},
res=a[0]
对于(变量i=1;i
关于代码需要注意的一点是,您的过滤器函数有一个依赖于闭包的内部函数。闭包是由新函数创建的范围
您似乎对javascript的功能方面很好奇。我想推荐一本书,叫做。与许多javascript书籍不同,它试图更多地关注javascript的功能方面。在这个问题上,它比我能做的更深入。你能修改我的例子来解释一下,使用匿名函数还是使用变量?非常有趣的一点顺便说一下。谢谢。谢谢,我会看你的答案,也谢谢你的推荐。:)!!对不起,我有几个问题要问,你能解释一下作者在第一个返回语句末尾添加.length
的意图吗?如果你是JS编译器,你会如何解释`res=res.filter(function(el){returna[i].filter(function(el2){return el2.tagId===el.tagId}).length}`,您将如何运行代码,强制将在什么时候发生?您最终将返回到res。我的目标是通过解构表达式来解释这一点。您是否阅读了array.filter()上的文档
?评估中是否有特定部分不清楚?我了解过滤器的工作原理!但我不了解双返回语句返回的确切内容以及返回顺序!
var moreThan2 = function(el) {
return el > 2 ? true : false;
}
[1,2,3].filter(moreThan2);
function common( /*…*/ ) {
var a = arguments,
filterListForTagsWithMoreThanOneMatchingElement = function(el) {
function findTagsWithSameTag(el2) {
return el2.tagId === el.tagId;
}
return a[0].filter(findTagsWithSameTag).length;
},
res = a[0]
for (var i = 1; i < a.length; i++) {
res = res.filter(filterListForTagsWithMoreThanOneMatchingElement);
}
return res
}