如何在JavaScript中找到数组数组中最长的数组

jma*_*rje 15 javascript arrays

如果您有一个包含无限数量的数组的数组

例如:

var masterArray = [ [1,2,3,4,5],
                    [1,2], 
                    [1,1,1,1,2,2,2,2,4,4],
                    [1,2,3,4,5] ];
Run Code Online (Sandbox Code Playgroud)

在masterArray中查找最长数组索引的有效方法是什么?(在这个例子中索引是2).

vp_*_*rth 14

var masterArray = [ [1,2,3,4,5],
                    [1,2], 
                    [1,1,1,1,2,2,2,2,4,4],
                    [1,2,3,4,5] ];
Run Code Online (Sandbox Code Playgroud)

单线是:

masterArray.map(function(a){return a.length;}).indexOf(Math.max.apply(Math, masterArray.map(function(a){return a.length;})));
Run Code Online (Sandbox Code Playgroud)

但最好缓存map结果.

var lengths = masterArray.map(function(a){return a.length;});
lengths.indexOf(Math.max.apply(Math, lengths));
Run Code Online (Sandbox Code Playgroud)

注意,即使这种代码迭代阵列3次(map,max,indexOf分别).
为了提高效率,您应该手动迭代数组.

var max = -Infinity;
var index = -1;
masterArray.forEach(function(a, i){
  if (a.length>max) {
    max = a.length;
    index = i;
  }
});
Run Code Online (Sandbox Code Playgroud)

Reduce 方法:

masterArray.reduce(function(maxI,el,i,arr) {return el.length>arr[maxI].length ? i : maxI;}, 0)
Run Code Online (Sandbox Code Playgroud)


Dow*_*oat 9

.reduce 是最好的方法:

masterArray.reduce(function (pending, cur, index, ar) { ar[ pending ].length > cur.length ? pending : index }, 0);
Run Code Online (Sandbox Code Playgroud)

或者使用ES6:

masterArray.reduce((p, c, i, a) => a[p].length > c.length ? p : i, 0);
Run Code Online (Sandbox Code Playgroud)


vsy*_*ync 5

reducer 迭代数组数组,其中累加器表示最长数组的索引,从 index 开始0

对于每次迭代,当前项的(数组lengthlength找到的当前最长数组的(arrays[acc])进行比较,如果更大,则累加器设置为那个 index

var arrays = [ 
  [1,1,1,1,1],
  [1,1], 
  [1,1,1,1,1,1,1,1],   // ? The longest, which is at index 2
  [1,1,1,1],
  [1,1,1,1,1,1]
]

var indexOfLongestArray = arrays.reduce((acc, arr, idx) => {
  console.log(acc, idx, JSON.stringify([arr, arrays[acc]]))
  return arr.length > arrays[acc].length ? idx : acc
}, 0)

// print result:
console.log( "longest array is at index: ", indexOfLongestArray )
Run Code Online (Sandbox Code Playgroud)

短功能:

var indexOfLongestArray = list => list.reduce((a, arr, idx) => 
  arr.length > arrays[a].length ? idx : a
, 0)
Run Code Online (Sandbox Code Playgroud)