我试图在输入中展平数组数组,并返回最长的字符串。
例如给出输入:
i = ['big',[0,1,2,3,4],'tiny']
该函数应返回'tiny'。我想使用reduce或concat以原生和优雅的方式解决此问题(没有实现flatten prototype in array),但我没有使用此代码:
function longestStr(i)
{
// It will be an array like (['big',[0,1,2,3,4],'tiny'])
// and the function should return the longest string in the array
// This should flatten an array of arrays
var r = i.reduce(function(a, b)
{
return a.concat(b);
});
// This should fetch the longest in the flattened array
return r.reduce(function (a, b)
{
return a.length > b.length ? a : b;
});
}
答案 0 :(得分:6)
您的问题是您忘记将initialValue
参数传递给reduce函数,在这种情况下该函数必须是数组。
var r = i.reduce(function(a, b) {
return a.concat(b);
}, []);
如果不提供initialValue
,则第一次调用的a
值将是i
数组中的第一个元素,即 big 中的字符串 big 您的情况,因此您将调用String.prototype.concat
函数而不是Array.prototype.concat
。
这意味着最后,r
是一个字符串,字符串没有reduce
函数。
您的解决方案可以简化:
['big',[0,1,2,3],'tiny'].reduce(function longest(a, b) {
b = Array.isArray(b)? b.reduce(longest, '') : b;
return b.length > a.length? b : a;
}, '');
答案 1 :(得分:0)
您没有提及具有相同长度的多个字符串 - 或者如果你关心IE8 ......
function longestStr(A){
var i= 0, len, A= String(A).split(/\b/).sort(function(a, b){
return a.length<b.length;
});
len= A[0].length;
while(A[i].length==len)++i;
return A.slice(0, i);
}
var A1= ['big', [0, 1, 2, 3, 4], 'tiny',[1,2,3,'puny']];
longestStr(A1);
/* returned value: (Array)
tiny,puny
*/
方法2:
您没有将字符串定义为单个字词 -
任何数组分隔符都可以包含在任何值中,这使我的解决方案不正确。
展平数组会使每个项目的长度比较简单 -
并且不必将其作为原型方法完成:
function longestStr(array){
function flatten(arr){
var A1= [], L= arr.length, next;
for(var i= 0; i<L; i++){
next= arr[i];
if(next.constructor!= Array) A1.push(String(next));
else A1= A1.concat(flatten(next));
}
return A1;
}
var i= 0, len, A=flatten(array);
A.sort(function(a, b){
return a.length<b.length;
});
len= A[0].length;
while(A[i].length== len)++i;
return A.slice(0, i);
}
var Ax= ['big stuff', [0, 1, 2, 3, 4], 'tiny', [1, 2, 3, 'puny']];
longestStr(Ax);
/* returned value: (Array)
big stuff
*/