理解双返回语句需要Javascript

理解双返回语句需要Javascript,javascript,Javascript,我是JS新手,基本上每天都在学习新东西,我只是在学习一些东西,比如,如何动态更新数组等等。无论如何,我通常会尝试从网络中挑选干净的JS代码片段并进行调试,直到我明白它的真正含义。下面是我今天发现的一个片段: var array1 = [ { tagId: 1, tagName: 'tag 1' }, { tagId: 2, tagName: 'tag 2' }, { ta

我是JS新手,基本上每天都在学习新东西,我只是在学习一些东西,比如,如何动态更新数组等等。无论如何,我通常会尝试从网络中挑选干净的JS代码片段并进行调试,直到我明白它的真正含义。下面是我今天发现的一个片段:

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
}