使用Javascript在数组中展平

时间:2016-07-13 11:01:57

标签: javascript arrays

问题是尝试删除嵌套数组:

steamrollArray([1, [2], [3, [[4]]]]); // should return [1, 2, 3, 4]

我试过这个但是当嵌套数组出现时递归失败。

function checkElement(el) {
    if (Array.isArray(el)) {
        if (el.length === 1) {
            return checkElement(el[0]); 
        } else {
            for (var i=0; i < el.length; i++){
                checkElement(el[i]); 
            }  
        }

    } else {
        return (el);    
    }   
}

function steamrollArray(arr) {
  var finalArr = [];
    for (var i=0; i < arr.length; i++){
        finalArr.push(checkElement(arr[i])); 
    }  


  return (finalArr);

}

9 个答案:

答案 0 :(得分:3)

第一部分的提案:

您可以将返回值更改为数组,并使用concat而不是push。

function checkElement(el) {
    // collect the values of the checked array
    var temp = [];
    if (Array.isArray(el)) {
        if (el.length === 1) {
            return checkElement(el[0]);
        } else {
            for (var i = 0; i < el.length; i++) {
                // collect the values
                temp = temp.concat(checkElement(el[i]));
            }
            // return flat values
            return temp;
        }
    } else {
        return el;
    }
}

// this can be shorten to
function steamrollArray(arr) {
    return checkElement(arr);
}

console.log(steamrollArray([1, [2], [3, [[4]]]]));

第二部分,有点短:

function steamrollArray(arr) {
    return arr.reduce(function flat(r, a) {
        return Array.isArray(a) && a.reduce(flat, r) || r.concat(a);
    }, []);
}

console.log(steamrollArray([1, [2], [3, [[4]]]]));

答案 1 :(得分:3)

我认为这是最有趣的方式,而且它不再是一行。它还将提取留给本机代码,这比脚本编写快得多。

&#13;
&#13;
var nestedArray = [1, [2], [3, [[4]]]];
var flatten = nestedArray.toString().split(',').map(Number);

console.log(flatten);
&#13;
&#13;
&#13;

答案 2 :(得分:2)

您可以使用reduce

function flatten( array ){
  return array.reduce( function (a, b){
    return a.concat( Array.isArray(b) ? flatten(b) : b );
  }, [] );
}

答案 3 :(得分:1)

您可以使用这样的递归:

function flatten(array) {
    var flat = []; //The result array
    //An IIFE that will perform the recursion,
    //is equivalent to: function rec(param) {.....}; rec(param);
    (function rec(a) {
        //For each element in the array:
        //If the element is an array then call the 'rec' function.
        //Else, push it to the result array.
        //I used the conditional (ternary) operator (condition ? expr1 : expr2 )
        for(var i in a) Array.isArray(a[i]) ? rec(a[i]) : flat.push(a[i]);
    })(array);//Initiate the recursion with the main array 
    return flat;//Return the final result
};

var a = [1, [2], [3, [[4]]]];


function flatten(array) {
    var flat = [];      
    (function rec(a) {
        for(var i in a) Array.isArray(a[i]) ? rec(a[i]) : flat.push(a[i]);
    })(array);        
    return flat;
};

console.log(flatten(a));

答案 4 :(得分:1)

使用生成器函数可以有效地迭代嵌套数组元素,而无需分配不必要的内存。如果您确实需要扁平数组,请使用[...iterable]Array.from(iterable)

&#13;
&#13;
function* deepIterate(array) {
  for (a of array) Array.isArray(a) ? yield* deepIterate(a) : yield a;
}

// Iterate through flattened array:
for (a of deepIterate([1,[2,[3]]])) console.log(a);

// Flatten array:
var flat = Array.from(deepIterate([1,[2,[3]]]));
console.log(flat);
&#13;
&#13;
&#13;

答案 5 :(得分:0)

您不能只返回值,或者当您拥有长度为&gt;的数组时它不会起作用。 1。

这是一个解决方案:

&#13;
&#13;
function steamrollArray(arr, flattened) {
    if (!flattened) flattened = [];
    for (var i=0; i < arr.length; i++){
         if (Array.isArray(arr[i])) {
             steamrollArray(arr[i], flattened);
         } else {
             flattened.push(arr[i]);
         }
    }  
    return flattened;
}

console.log(steamrollArray([1, [2], [3, [[4]]]])); // should return [1, 2, 3, 4]
&#13;
&#13;
&#13;

答案 6 :(得分:0)

  

如果适合您,请尝试此操作

function steamrollArray(unflatenArr) {
    var flatenArr = [];
    if (Array.isArray(unflatenArr)) {
        for (var i = 0; i < unflatenArr.length; i++)
            arrFlat(unflatenArr[i], flatenArr);
    }
    return flatenArr;
}
function arrFlat(arr, refArr) {
    if (Array.isArray(arr)) {
        for (var i = 0; i < arr.length; i++) {
            arrFlat(arr[i], refArr);
        }
    }
    else {
        refArr.push(arr);
    }
}

答案 7 :(得分:0)

不使用任何递归的更简单的解决方案是使用Arrays的splice方法。它适用于任何级别的嵌套。

class A():
    def __init__():
        self.fields()

    def fields():
        ### code to display entry_field for user input

    def user_entry(self):
        club_name_existing  = entry_field.get()

class B():
    def __init__():
        pass

    def load_entry():
        db = create_engine('sqlite:///' + A.club_name_existing + '.db')

答案 8 :(得分:-1)

试试这个:

function steamrollArray(unflatenArr){
    return eval("["+(JSON.stringify(unflatenArr).replace(/\[/g,'').replace(/\]/g,''))+"]")
}

steamrollArray([1, [2], [3, [[4]]]]);