Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Javascript在数组中展平_Javascript_Arrays - Fatal编程技术网

使用Javascript在数组中展平

使用Javascript在数组中展平,javascript,arrays,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

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

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

}

不能只返回值,否则当数组的长度大于1时,它将不起作用

这里有一个解决方案:

功能蒸汽辊阵列,扁平{ 如果!展平=[]; 对于变量i=0;iconsole.logstreamrollArray[1[2],[3,[[4]]];//应该返回[1,2,3,4]不能只返回值,否则当数组的长度大于1时,它将不起作用

这里有一个解决方案:

功能蒸汽辊阵列,扁平{ 如果!展平=[]; 对于变量i=0;iconsole.logstreamrollArray[1[2],[3,[[4]]];//应该返回[1,2,3,4]您可以像这样使用递归:

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
};
变量a=[1,2],[3,4]]; 函数展平阵列{ var平坦=[]; 功能重建{ 数组中的forvari.isArraya[i]?reca[i]:flat.pusha[i]; }阵列; 返回平面; };
console.loga 可以像这样使用递归:

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
};
变量a=[1,2],[3,4]]; 函数展平阵列{ var平坦=[]; 功能重建{ 数组中的forvari.isArraya[i]?reca[i]:flat.pusha[i]; }阵列; 返回平面; };
console.loga 第一部分的提案:

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

功能检查元件{ //收集选中数组的值 var-temp=[]; if Array.isArrayel{ 如果el.length==1{ 返回checkElementel[0]; }否则{ 对于变量i=0;iconsole.logstreamrollArray[1,2],[3,[[4]] 第一部分的提案:

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

功能检查元件{ //收集选中数组的值 var-temp=[]; if Array.isArrayel{ 如果el.length==1{ 返回checkElementel[0]; }否则{ 对于变量i=0;i
function steamrollArray(unflatenArr){
    return eval("["+(JSON.stringify(unflatenArr).replace(/\[/g,'').replace(/\]/g,''))+"]")
}

steamrollArray([1, [2], [3, [[4]]]]);
试试这个:

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

steamrollArray([1, [2], [3, [[4]]]]);
您可以使用reduce:

您可以使用reduce:

如果对你有用,试试这个

如果对你有用,试试这个


使用生成器函数可以有效地迭代嵌套数组元素,而无需分配不必要的内存。如果确实需要展平阵列本身,请使用[…iterable]或array.fromiterable:

函数*deepiteratarray{ 对于数组a.isArraya?yield*deepIteratea:yield a; } //遍历展平数组: 对于deepIterate[1、[2、[3]]]console.loga; //展平阵列: var flat=Array.fromdeepIterate[1,2,3]];
控制台。对数平面 使用生成器函数可以有效地迭代嵌套数组元素,而无需分配不必要的内存。如果确实需要展平阵列本身,请使用[…iterable]或array.fromiterable:

函数*deepiteratarray{ 对于数组a.isArraya?yield*deepIteratea:yield a; } //遍历展平数组: 对于deepIterate[1、[2、[3]]]console.loga; //展平阵列: var flat=Array.fromdeepIterate[1,2,3]];
控制台。对数平面 我认为这将是最有趣的方式来做这件事,而且它是一行不再。此外,它将提取留给本机代码,这比脚本编写快得多

变量nestedArray=[1[2],[3],[4]]; var flant=nestedArray.toString.split','.mapNumber;
console.logflatte 我认为这将是最有趣的方式来做这件事,而且它是一行不再。此外,它将提取留给本机代码,这比脚本编写快得多

变量nestedArray=[1[2],[3],[4]]; var flant=nestedArray.toString.split','.mapNumber;
console.logflatte 一个不使用任何递归的简单解决方案是使用数组拼接方法。它适用于任何级别的嵌套

function flattenArray(arr){

  for(var i=0;i<arr.length;i++){

    if(arr[i] instanceof Array){

      Array.prototype.splice.apply(arr,[i,1].concat(arr[i]))
       i--;
    }

  }

  return arr;
}

不使用usin的简单解决方案 g任何递归都是通过数组拼接方法实现的。它适用于任何级别的嵌套

function flattenArray(arr){

  for(var i=0;i<arr.length;i++){

    if(arr[i] instanceof Array){

      Array.prototype.splice.apply(arr,[i,1].concat(arr[i]))
       i--;
    }

  }

  return arr;
}


不重复:此特定问题与未指定的深度有关,而与展平数组无关。未展平数组中的值也可以是非数字的?从类似问题中检查不重复:此特定问题与未指定的深度有关,不是关于整平数组。未整平数组中的值也可以是非数字的?从一个类似的问题中检查我认为,但解决方案也必须接受空对象{}:/这确实是一个不可行的解决方案。因为在没有紧急情况下替换并最终使用eval。如果输入是字符串,则会导致问题。比如说:[1,[2],3,[4]]我在想,但是解决方案也必须接受空对象{}:/这确实是一个不可行的解决方案。因为在没有紧急情况下替换并最终使用eval。如果输入是字符串,则会导致问题。比如说:[1,[2],3,[4]]很棒,但我不明白你写了什么。我已经对代码进行了注释。我希望这会对你有所帮助,我随时都可以得到进一步的解释;太棒了,但我不明白你写了什么。我已经对代码进行了注释。我希望这会对你有所帮助,我随时都可以得到进一步的解释;我从您对另一个答案的评论中看到,Flatte应该接受非数组值。我修改了代码,如果参数不是数组,则返回[]。我从您对另一个答案的评论中看到,flatten应该接受非数组值。我修改了代码,如果参数不是数组,则返回[]。谢谢,我理解了第一个解决方案,并且它通过了测试。第二个我不遵循,但我相信它也有效。如果您添加注释,我可能会遵循它。它只是使用Arrayreduce,以一个空数组作为起始值,并使用一个回调,如果元素是数组,则返回每个元素调用的值,或者返回值本身。谢谢,我理解了第一个解决方案,并通过了测试。第二个我不遵循,但我相信它也有效。如果你添加注释,我可能会遵循它。它只是使用Arrayreduce,其中一个空数组作为起始值,一个回调,如果元素是数组,则返回每个元素调用的值,或者返回值本身。你是我见过的最伟大的开发人员。你是我见过的最伟大的开发者。帕什马阿姆。