使用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;i
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;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,其中一个空数组作为起始值,一个回调,如果元素是数组,则返回每个元素调用的值,或者返回值本身。你是我见过的最伟大的开发人员。你是我见过的最伟大的开发者。帕什马阿姆。