理解Double return语句是Javascript

时间:2015-04-04 03:22:18

标签: javascript

嘿伙计们我是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
}

基本上,片段通过数组中的对象文字进行太阳活动并将其过滤掉。现在,继承人我的问题。作为JS的新手,我遇到了一个有趣的例子,看到很多JS代码快速连续地使用return语句,或者说是一个接一个,通常它们是嵌套的,这对我来说是一个非常有趣的案例,因为通常我猜一个单一的return语句应该是所有人需要的。

无论如何,回到我的例子以及我的困难是什么,如果你看到common function中的代码,你会看到下面的代码:

res = res.filter(function (el) {
                return a[i].filter(function (el2) {
                    return el2.tagId === el.tagId
                }).length
            })

我真的不理解双返回语句。据我所知,return el2.tagId === el.tagId返回true或false并返回

a[i].filter(function (el2) {
                        return el2.tagId === el.tagId
                    }).length 

返回长度,我认为应该是一个整数,但是返回执行的顺序是什么?谁return el2.tagId === el.tagId回到?? 。

当我看到双重回复声明时,我总是感到困惑,请有人向我解释一下吗?

jsfiddle here

编辑:: 尝试在答案中做一些精心设计。

谢谢。

亚历-Z。

2 个答案:

答案 0 :(得分:3)

这些“双”返回嵌套在匿名函数中;他们不是从同一个环境中回来的。

彻底解决:

return el2.tagId === el.tagId

filter()的{​​{1}}方法中从匿名函数返回一个布尔值:

a[i]

a[i].filter(function (el2) { return el2.tagId === el.tagId }) filter()方法的匿名函数中返回该表达式的结果长度:

res

注意:结果的res = res.filter(function (el) { return a[i].filter(function (el2) { return el2.tagId === el.tagId }).length }) 属性被length强制转换为布尔值。

filter()是Array原型的一个方法,它构造一个新的数组,由提供的匿名函数返回true的项组成(参见MDN:Array.prototype.filter

答案 1 :(得分:2)

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开发人员利用匿名函数,这些函数不会被赋值给变量。

EDITS

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
}

关于代码需要注意的一点是,你的过滤函数有一个依赖于闭包的内部函数。闭包是由新函数创建的范围。

好像你对javascript的功能方面感到好奇。我会推荐一本名为eloquent javascript的书。与许多javascript书不同,它试图更多地关注javascript的功能方面。在这个问题上,它比我更深入。