繁体   English   中英

在javascript中展平数组数组以获取最长的字符串

[英]Flatten an array of arrays in javascript for get the longest string

我试图在输入中展平数组数组,并返回最长的字符串。

例如,给定输入:

i = ['big',[0,1,2,3,4],'tiny'] 

该函数应返回'tiny' 我想使用reduceconcat以原生和优雅的方式解决这个问题(没有在数组中实现flatten原型 )但我没有使用这段代码:

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; 
        });
}

您的问题是您忘记将initialValue参数传递给reduce函数,在这种情况下,该函数必须是数组。

var r = i.reduce(function(a, b) {
    return a.concat(b);
}, []);

如果没有提供initialValue ,该a对第一次调用值将是第一个元素i阵列,它是在你的情况下,字符串 ,那么你将被调用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;
}, '');

你没有提到具有相同长度的多个字符串 - 或者如果你关心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:

您没有将字符串定义为单个单词 -

任何数组delimeters都可以包含在任何值中,使我的解决方案不正确。

展平阵列使得比较每个项目的长度变得简单 -

并且它不必作为原型方法完成:

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
*/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM