我知道这会产生一个包含数组中所有常见元素的数组,但我不明白这行代码是如何实现的。当我查找shift()时,它看起来应该取出数组的第一个元素,这是一个数组本身。基本上,我很困惑,想知道是否有人可以通过虚拟步骤指导我实际发生的事情。谢谢!
var arrays = [
['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco','pizza'],
['taco', 'fish', 'apple', 'pizza'],
['banana', 'pizza', 'fish', 'apple']
];
var result = arrays.shift().filter(
function(v) {return arrays.every(
function(a) {return a.indexOf(v) !== -1;});
});
答案 0 :(得分:1)
var arrays = [
['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco','pizza'],
['taco', 'fish', 'apple', 'pizza'],
['banana', 'pizza', 'fish', 'apple']
];
正确看到的 arrays.shift()
接受第一个元素['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco','pizza']
然后过滤掉该数组的每个元素(使您正在过滤的每个当前元素都可用作v
)。然后检查每个子数组是否包含该元素v
。如果满足该条件(indexOf不通过API指定返回-1),则返回该元素。
最终,您的result
数组包含[ 'apple', 'fish', 'pizza' ]
。
答案 1 :(得分:1)
打破一些代码可能有所帮助,我们可以拆分过滤函数,使主代码更清晰:
var result = arrays.shift().filter(myFilterFunc);
function myFilterFunc(element) {
return arrays.every(function(a){
return a.indexOf(element) !== -1;
});
}
Array.prototype.shift()
将通过删除并返回第一个元素来改变数组:
var arrays = [
['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco','pizza'],
['taco', 'fish', 'apple', 'pizza'],
['banana', 'pizza', 'fish', 'apple']
];
arrays.shift() //returns ['apple', 'orange', 'banana', etc...]
//arrays now equals [ ['taco', 'fish', etc.], ['banana', 'pizza', etc.]
发生转变后,运行Array.prototype.filter()
,它接受过滤函数作为其参数。这将返回一个新数组,其中包含在过滤器函数中返回true
的所有元素。在这种情况下,过滤器函数中的条件在Array.prototype.every()
数组上运行arrays
。如果数组中的每个元素都通过特定条件,则every()
返回true
:
a.indexOf(element) //checks if element is in array a
答案 2 :(得分:1)
shift()
函数将从arrays
中移除第一个数组并将其返回。
result === arrays.shift() === ["apple", "orange", "banana", "pear", "fish", "pancake", "taco", "pizza"]
arrays === [['taco', 'fish', 'apple', 'pizza'],['banana', 'pizza', 'fish', 'apple']]
然后filter()
从results
中删除其余两个数组中存在的每个项目。然后,您最终得到["apple", "fish", "pizza"]
作为最终答案。
答案 3 :(得分:1)
参见补充评论:
var result = arrays.shift().filter( // Grab first array, and filter
function(v) { // each value to check if:
return arrays.every( // all of the remaining arrays
function(a) {
return a.indexOf(v) !== -1; // contain a matching value
}
);
}
);
答案 4 :(得分:0)
以下代码:
var arrays = [
['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco','pizza'],
['taco', 'fish', 'apple', 'pizza'],
['banana', 'pizza', 'fish', 'apple']
];
var result = arrays.shift().filter(
function(v) {return arrays.every(
function(a) {return a.indexOf(v) !== -1;});
});
这里发生了什么声明:
var result = arrays.shift().filter(
...
});
对于arrays.shift()
,返回第一个数组元素['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco','pizza']
,这将用作结果的基础。 .filter()
方法将修改此数组。
function(v) {return arrays.every(
...
});
这意味着对于2D数组arrays
中的每个数组,在这种情况下v
表示基本数组['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco','pizza']
中的每个元素。虽然a
表示arrays
内的每个数组。
function(a) {return a.indexOf(v) !== -1;});
最后,这意味着对于所有数组(a
),如果它存在于基数组v
中,那么它将返回true
,否则如果['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco','pizza']
内的元素1}}不在其他数组中,然后返回false
并删除该元素。
换句话说,['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco','pizza']
中的每个元素都必须有arrays
内其他数组的匹配元素。