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。
答案 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的功能方面。在这个问题上,它比我更深入。