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)
.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)
reducer 迭代数组数组,其中累加器表示最长数组的索引,从 index 开始0。
对于每次迭代,当前项的(数组)length与length找到的当前最长数组的(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)