试图理解处理多维数组的Javascript代码行

时间:2017-01-31 00:30:29

标签: javascript arrays multidimensional-array

我知道这会产生一个包含数组中所有常见元素的数组,但我不明白这行代码是如何实现的。当我查找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;});
});

5 个答案:

答案 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内其他数组的匹配元素。